2016-04-26 61 views
1

我有一個CSV文件看起來像熊貓讀取多個空格CSV和解析日期

Year Mo Da (01,52) 
1950 1 1 0.00  
1950 1 2 0.00  
1950 1 3 0.05  
1950 1 4 0.00  
1950 1 5 0.07  
1950 1 6 0.07 

,我想它有2列轉換成數據幀:年月日的日期時間列(使用「年原始數據中的「Mo」和「Da」列),然後將網格點(例如01,52)的降雨量作爲第二列。

所需的輸出是:

Datetime Rainfall 
19500101 0.00 
19500102 0.00 
19500103 0.05 

我被困在兩個問題上:讀取到的過程中適當佔空格和正確使用parse_dates

簡單讀入的命令:

df = pd.read_csv(csv_fl) 

幾乎正確地讀入頭信息,但拆分(01,52)轉換成單獨的列,得到的後NaN時,其不應該存在。

 Year Mo Da (01 52) 
0 1950 1 1 0.00 NaN 

,並試圖使用

df = pd.read_csv(csv_fl, parse_dates={'Datetime':[0,1,2]}, index_col=0) 

解析日期導致了IndexError

colnames.append(str(columns[c])) 
IndexError: list index out of range 

任何指導是非常讚賞。

回答

1

如果傳遞PARAMS delim_whitespace=True,並通過在列表中的3列parse_dates最後一步就是覆蓋列名:

In [96]: 
import pandas as pd 
import io 
t="""Year Mo Da (01,52) 
1950 1 1 0.00  
1950 1 2 0.00  
1950 1 3 0.05  
1950 1 4 0.00  
1950 1 5 0.07  
1950 1 6 0.07""" 
df =pd.read_csv(io.StringIO(t), delim_whitespace=True, parse_dates=[['Year','Mo','Da']]) 
df.columns = ['Datetime', 'Rainfall'] 
df 

Out[96]: 
    Datetime Rainfall 
0 1950-01-01  0.00 
1 1950-01-02  0.00 
2 1950-01-03  0.05 
3 1950-01-04  0.00 
4 1950-01-05  0.07 
5 1950-01-06  0.07 

因此,我希望:df = pd.read_csv(csv_fl, delim_whitespace=True, parse_dates=[['Year','Mo','Da']])

應該工作之後覆蓋列名

+0

太棒了,謝謝。允許時我會接受答案。 – N1B4

0
filename = "..." 
>>> pd.read_csv(filename, 
       sep=" ", 
       skipinitialspace=True, 
       parse_dates={'Datetime': [0, 1, 2]}, 
       usecols=[0, 1, 2, 3], 
       names=["Y", "M", "D", "Rainfall"], 
       skiprows=1) 
    Datetime Rainfall 
0 1950-01-01  0.00 
1 1950-01-02  0.00 
2 1950-01-03  0.05 
3 1950-01-04  0.00 
4 1950-01-05  0.07 
5 1950-01-06  0.07