我有一个看起来像
的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
非常感谢任何指导。
答案 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