使用pandas操作csv数据
这里有一个关于pandas的数据问题。我想从一个csv文件中提取两列数据,然后对这些数据进行处理,最后再保存。
这个csv文件的内容是:
year month
2007 1
2007 2
2007 3
2007 4
2008 1
2008 3
这是我现在的代码:
records = pd.read_csv(path)
frame = pd.DataFrame(records)
combined = datetime(frame['year'].astype(int), frame['month'].astype(int), 1)
出现的错误是:
TypeError: cannot convert the series to "<type 'int'>"
有什么想法吗?
2 个回答
0
我遇到过类似的问题,答案是你需要确保你的数据表中有年、月和日这几列:
df['Date'] = df[['Year', 'Month', 'Day']].apply(lambda s : datetime.datetime(*s),axis = 1)
第一部分是从数据表中选择年、月和日期这几列,第二部分则是对这些数据逐个应用日期时间的函数。
如果你的数据中没有日这一列,就像你的数据所示的那样,你可以这样做:
df['Day'] = 1
这样就可以把日的值填上了。这虽然不是最优的代码解决方案,但可以快速解决问题。如果你不想要这个日的列,之后可以随时把它删掉。
2
在处理 pandas 的数据列时,直接用 datetime 是不行的。你可以用 to_datetime
函数,或者在 apply
里使用 datetime
。像下面这样应该就能正常工作:
In [9]: df
Out[9]:
year month
0 2007 1
1 2007 2
2 2007 3
3 2007 4
4 2008 1
5 2008 3
In [10]: pd.to_datetime(df['year'].astype(str) + '-'
+ df['month'].astype(str)
+ '-1')
Out[10]:
0 2007-01-01
1 2007-02-01
2 2007-03-01
3 2007-04-01
4 2008-01-01
5 2008-03-01
dtype: datetime64[ns]
或者你也可以使用 apply:
In [11]: df.apply(lambda x: datetime(x['year'],x['month'],1),axis=1)
Out[11]:
0 2007-01-01
1 2007-02-01
2 2007-03-01
3 2007-04-01
4 2008-01-01
5 2008-03-01
dtype: datetime64[ns]
另一个补充:你也可以在用 read_csv
时处理大部分日期解析,但这样的话,你需要在读取数据后调整一下 day(注意,我的数据是放在一个叫 'data' 的字符串里):
In [12]: df = pd.read_csv(StringIO(data),header=True,
parse_dates={'date':['year','month']})
In [13]: df['date'] = df['date'].values.astype('datetime64[M]')
In [14]: df
Out[14]:
date
0 2007-01-01
1 2007-02-01
2 2007-03-01
3 2007-04-01
4 2008-01-01
5 2008-03-01