2014-12-03 66 views
4

目前我正在使用熊貓來讀取一個csv文件到DataFrame,使用第一列作爲索引。第一列是在ISO 8601格式,所以根據用於read_csv的文檔,但應認識爲datetime:熊貓read_csv不識別ISO8601作爲日期時間dtype

In [1]: import pandas as pd 

In [2]: df = pd.read_csv('data.csv', index_col=0) 

In [3]: print df.head() 
         U  V  Z Ubar Udir 
2014-11-01 00:00:00 0.73 -0.81 0.46 1.0904 317.97 
2014-11-01 01:00:00 1.26 -1.50 0.32 1.9590 319.97 
2014-11-01 02:00:00 1.50 -1.80 0.13 2.3431 320.19 
2014-11-01 03:00:00 1.39 -1.65 0.03 2.1575 319.89 
2014-11-01 04:00:00 0.94 -1.08 -0.03 1.4318 318.96 

然而,查詢索引D型細胞時,它返回「對象」:

In [4]: print df.index.dtype 
object 

我那麼必須手動將其轉換爲datetime D型:

In [5]: df.index = pd.to_datetime(df.index) 

In [6]: print df.index.dtype 
datetime64[ns] 

有什麼辦法可以自動調用有當設置日期時間D型指數?

+6

你不告訴它解析列日期時間'DF = pd.read_csv( 'data.csv',parse_dates = 0,index_col = 0)' – EdChum 2014-12-03 16:32:46

+0

是的,這是訣竅!出於某種原因,當我閱讀'read_csv'的文檔時,我認爲'parse_dates'默認爲'True',可能來自閱讀:「If True - >嘗試解析索引」 – 2014-12-04 08:43:53

+0

我一直髮現'read_csv'的這個方面docs是不明確的,可能是不正確的,我總是必須通過整數索引,注意如果你想解析多列,像這樣:'parse_dates = [0,3,4]'和嵌套列出您是否希望它將多個列解析爲單個日期時間col:'parse_dates = [[0,1]]'。所以我注意到,設置'parse_dates = True'不起作用,所以我總是通過一個列表或單個int列索引 – EdChum 2014-12-04 09:02:30

回答

1

read_csv文檔描述parse_dates參數:

parse_dates:布爾或整數或名或目錄的列表列表或字典,默認爲False
- 布爾值。如果爲True - >嘗試解析索引。
- 整數或名稱列表。例如如果[1,2,3] - >嘗試解析每個列作爲單獨的日期列。
- 列表的列表。例如如果[[1,3]] - >將第1列和第3列組合起來並將其解析爲 單個日期列。
- 字典,例如{'foo':[1,3]} - >將列1,3解析爲日期和調用結果'foo'
注意:iso8601格式的日期存在快速路徑。

既然要分析指標可以使用:

import pandas as pd 
df = pd.read_csv('data.csv', index_col=0, parse_dates=True) 
+0

這是正確的答案;然而,在提出原始問題時,[pandas 0.15.1]中的read_csv文檔(http://pandas.pydata.org/pandas-docs/version/0.15.1/generated/pandas.read_csv .html#pandas.read_csv)沒有指定'parse_dates'的默認值:) – 2017-02-10 12:46:15

1

我剛剛在csv文件中添加了第一列的列名。

    Date  U  V  Z Ubar Udir 
0 2014-11-01 00:00:00 0.73 -0.81 0.46 1.0904 317.97 
1 2014-11-01 01:00:00 1.26 -1.50 0.32 1.9590 319.97 
2 2014-11-01 02:00:00 1.50 -1.80 0.13 2.3431 320.19 
3 2014-11-01 03:00:00 1.39 -1.65 0.03 2.1575 319.89 
4 2014-11-01 04:00:00 0.94 -1.08 -0.03 1.4318 318.96 

df = pd.read_csv(input_file) 
df.index = pd.to_datetime(df['Date'], format='%Y-%m-%d %H:%M:%S') 

如果你要刪除的日期欄,您可以使用

df = df.drop('Date', 1) 
+0

謝謝,但我已經在我的問題中表明,我可以手動改變索引dtype使用'pd.to_datetime()'。 – 2014-12-04 08:44:54