![](/img/trans.png)
[英]Convert pandas timezone-aware DateTimeIndex to naive timestamp, but in certain timezone
[英]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.