2016-07-22 49 views
4

當我使用pandas read_csv讀取具有可識別時區的datetime(並將此列指定爲索引)時,pandas會將其轉換爲DatetimeIndex的日期時間。如何閱讀時區感知日期時間作爲一個時區天真本地日期時間索引與read_csv在熊貓?

數據在Test.csv:

DateTime,Temperature 2016-07-01T11:05:07+02:00,21.125 2016-07-01T11:05:09+02:00,21.138 2016-07-01T11:05:10+02:00,21.156 2016-07-01T11:05:11+02:00,21.179 2016-07-01T11:05:12+02:00,21.198 2016-07-01T11:05:13+02:00,21.206 2016-07-01T11:05:14+02:00,21.225 2016-07-01T11:05:15+02:00,21.233

代碼以從CSV讀:

In [1]: import pandas as pd 

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

這導致代表時區幼稚UTC時間的索引:

In [3]: df.index 

Out[3]: DatetimeIndex(['2016-07-01 09:05:07', '2016-07-01 09:05:09', 
      '2016-07-01 09:05:10', '2016-07-01 09:05:11', 
      '2016-07-01 09:05:12', '2016-07-01 09:05:13', 
      '2016-07-01 09:05:14', '2016-07-01 09:05:15'], 
      dtype='datetime64[ns]', name='DateTime', freq=None) 

我試着用date_parser函數:

In [4]: date_parser = lambda x: pd.to_datetime(x).tz_localize(None) 

In [5]: df = pd.read_csv('Test.csv', index_col=0, parse_dates=True, date_parser=date_parser) 

這給出了相同的結果。

我怎樣才能讓read_csv創建DatetimeIndex是時區幼稚和代表的UTC時間當地時間呢?

我正在使用熊貓0.18.1。

+0

你看過[這個]嗎?(http://stackoverflow.com/questions/16628819/convert-pandas-timezone-aware-datetimeindex-to-naive-timestamp-but-in-certain-t?rq = 1 )? –

+0

是的,我做到了。但是這個具體問題是關於處理實際存在的時區信息。在我的問題中,pandas.read_csv通過將從csv讀取的日期時間轉換爲天真的utc datetime來丟失時區信息。 – Puggie

回答

2

亞歷克斯的answer導致了時區感知DatetimeIndex。爲了得到時區天真本地 DatetimeIndex,如要求由OP,告知dateutil.parser.parser忽略時區信息通過設置ignoretz=True

import dateutil 

date_parser = lambda x: dateutil.parser.parse(x, ignoretz=True) 
df = pd.read_csv('Test.csv', index_col=0, parse_dates=True, date_parser=date_parser) 

print(df) 

輸出

     Temperature 
DateTime       
2016-07-01 11:05:07  21.125 
2016-07-01 11:05:09  21.138 
2016-07-01 11:05:10  21.156 
2016-07-01 11:05:11  21.179 
2016-07-01 11:05:12  21.198 
2016-07-01 11:05:13  21.206 
2016-07-01 11:05:14  21.225 
2016-07-01 11:05:15  21.233 
2

根據the docs,默認date_parser使用dateutil.parser.parser。根據the docs for that function,默認是忽略時區。因此,如果您提供dateutil.parser.parser作爲date_parser kwarg,時區不轉換。

import dateutil 

df = pd.read_csv('Test.csv', index_col=0, parse_dates=True, date_parser=dateutil.parser.parse) 

print(df) 

輸出

      Temperature 
DateTime        
2016-07-01 11:05:07+02:00  21.125 
2016-07-01 11:05:09+02:00  21.138 
2016-07-01 11:05:10+02:00  21.156 
2016-07-01 11:05:11+02:00  21.179 
2016-07-01 11:05:12+02:00  21.198 
2016-07-01 11:05:13+02:00  21.206 
2016-07-01 11:05:14+02:00  21.225 
2016-07-01 11:05:15+02:00  21.233 
+0

這個答案肯定是有幫助的,但會導致時區知曉DatetimeIndex。在解析函數中添加參數'ignoretz = True'可以給出想要的時區樸素的DatetimeIndex。我添加了這個作爲問題的新答案。 – Puggie

0

我通過了dateutil技術今天早些時候,但已經轉向更快的替代方案:

date_parser = lambda ts: pd.to_datetime([s[:-5] for s in ts])) 

編輯:s[:-5]是正確的(截圖有錯誤)

在下面的截圖中,我輸入〜製表符分隔的文件55MB。 dateutil方法的工作原理,但需要更長的時間。

enter image description here

這是利用熊貓0.18.1和dateutil 2.5.3。

相關問題