Pandas读取具有多个空格和解析日期的csv

时间:2016-04-26 22:17:57

标签: python csv datetime pandas

我有一个看起来像

的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列的数据框:日期时间列YYYYMMDD(使用原始数据中的“年”,“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

非常感谢任何指导。

2 个答案:

答案 0 :(得分:1)

如果你传递参数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']])

应该工作,然后覆盖列名

答案 1 :(得分: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