簡體   English   中英

如何在pandas中使用read_csv讀取時區感知日期時間作為時區天真本地DatetimeIndex?

[英]How to read timezone aware datetimes as a timezone naive local DatetimeIndex with read_csv in pandas?

當我使用 pandas read_csv 讀取具有時區感知日期時間的列(並將此列指定為索引)時,pandas 將其轉換為時區天真 utc DatetimeIndex。

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。

根據文檔,默認date_parser使用dateutil.parser.parser 根據該函數的文檔,默認值是忽略時區。 因此,如果您提供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

Alex 的回答導致了時區感知 DatetimeIndex。 要按照 OP 的要求獲取時區天真本地DatetimeIndex,請通過設置ignoretz=True通知dateutil.parser.parser忽略時區信息:

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

我今天早些時候采用了dateutil技術,但后來改用了更快的替代方法:

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

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

在下面的屏幕截圖中,我導入了約 55MB 的制表符分隔文件。 dateutil方法有效,但需要更長的數量級。

在此處輸入圖片說明

這是使用熊貓 0.18.1 和 dateutil 2.5.3。


編輯 即使缺少Z-0000后綴,此 lambda 函數也能工作...

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

你甚至可以嘗試:

date_parser = lambda x : pd.to_datetime(x.str[:-6])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM