2016-04-26 75 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