2014-04-22 107 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