使用pandas从csv处理数据

时间:2014-04-22 06:37:23

标签: python 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 :(得分:2)

datetime不会对pandas系列(数据帧的列)进行操作。您可以使用to_datetime,也可以在datetime中使用apply。以下内容应该有效:

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完成大部分日期解析,但是在阅读之后需要调整(注意,我的数据位于名为&#39; data&#39;)的字符串中:

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

答案 1 :(得分:0)

如果有类似的问题,答案是假设您在DataFrame的列中包含年,月和日:

df['Date'] = df[['Year', 'Month', 'Day']].apply(lambda s : datetime.datetime(*s),axis = 1)

第一部分选择具有年,月和日期的列形式为Dateframe,第二部分在数据上逐元素地应用日期时间函数。

如果你没有把数据中的那一天看作是形成你的数据,那就行了:

df ['Day'] = 1

也把那天放在那里。应该是在代码中这样做,但将是快速解决方法。如果你不想要,可以随后删除Day专栏。