2014-04-22 108 views
2

这里是一个关于熊猫数据的问题。我正在寻找的是从csv文件中获取两列,并在最终保存它们之前处理这些数据。使用熊猫操纵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'>" 

有什么想法?

+0

我很确定这个文件是csv。以上数据只是格式的一个例子。然后我删除pd.DataFrame行。但问题仍然存在...... –

回答

2

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] 

或者使用应用:

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,但那么你就需要调整你在阅读之后(注意,我的数据是在一个名为“数据”的字符串):

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 
+0

你让我哭了@Karl D ...谢谢 –

0

也有类似的问题的答案是假设你有年份,月份和日在数据帧的列:

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

第一部分选择具有年,月,日形成Dateframe列,第二位应用日期时间函数元素式的数据。

,如果你不给一天的数据ASIT看起来形成了你的数据,只是做:有

DF [“日”] = 1

放置一天为好。应该是在代码中这样做的方式,但是会很快解决问题。如果你不想要,可以随后放弃Day列。

+0

嗯。当我输入这个时,看到有人发布simialr答案。将离开一段时间并稍后删除 – Joop

+0

是的,我前一段时间做了'to_datetime'回答,回来后在大约同一时间添加了'apply'回答。 –

+0

不是一个speedfreak我自己,但我测试了你和我的申请方法。 Youe的速度提高了大约50%,因为在开始应用之前,我有创建新数据框的开销。总之你可能会更好。同时处理1的日子比我的好。 – Joop