[英]How to read datetime with timezone in pandas
我正在嘗試從 csv 創建一個數據框,它的第一列就像
"2013-08-25T00:00:00-0400";
"2013-08-25T01:00:00-0400";
"2013-08-25T02:00:00-0400";
"2013-08-25T03:00:00-0400";
"2013-08-25T04:00:00-0400";
這是帶有時區的日期時間! 我已經用過類似的東西
df1 = DataFrame(pd.read_csv(PeriodC, sep=';', parse_dates=[0], index_col=0))
但結果是
2013-09-02 04:00:00
2013-09-03 04:00:00
2013-09-04 04:00:00
2013-09-05 04:00:00
2013-09-06 04:00:00
2013-09-07 04:00:00
2013-09-08 04:00:00
誰能解釋我如何將日期時間與時區分開?
Pandas 解析器將考慮時區信息(如果可用),並為您提供一個朴素的時間戳(朴素 == 無時區信息),但要考慮時區偏移。
要在 DataFrame 中保留時區信息,您應該首先將時間戳本地化為UTC
,然后將它們轉換為它們的時區(在本例中為Etc/GMT+4
):
>>> df = pd.read_csv(PeriodC, sep=';', parse_dates=[0], index_col=0)
>>> df.index[0]
>>> Timestamp('2013-08-25 04:00:00', tz=None)
>>> df.index = df.index.tz_localize('UTC').tz_convert('Etc/GMT+4')
>>> df.index[0]
Timestamp('2013-08-25 00:00:00-0400', tz='Etc/GMT+4')
如果您想完全丟棄時區信息,則只需指定一個date_parser
將拆分字符串並僅將日期時間部分傳遞給解析器。
>>> df = pd.read_csv(file, sep=';', parse_dates=[0], index_col=[0]
date_parser=lambda x: pd.to_datetime(x.rpartition('-')[0]))
>>> df.index[0]
Timestamp('2013-08-25 00:00:00', tz=None)
來自https://stackoverflow.com/a/18912631/4318671的x.rpartition('-')
不太好。
從 Influxdb 獲取的日期時間的字符串格式為“亞洲/上海”:
2019-09-09T12:51:54.46303+08:00
如果您使用的是pandas
,則可以嘗試
df['time'] = pd.to_datetime(df['time'])
如果您在導入 csv 時不解析日期,而是在第二步中使用pd.to_datetime
解析它們,您將獲得預期的固定 UTC 偏移量。 前任:
s = pd.Series(["2013-08-25T00:00:00-0400",
"2013-08-25T01:00:00-0400",
"2013-08-25T02:00:00-0400",
"2013-08-25T03:00:00-0400",
"2013-08-25T04:00:00-0400"])
pd.to_datetime(s)
0 2013-08-25 00:00:00-04:00
1 2013-08-25 01:00:00-04:00
2 2013-08-25 02:00:00-04:00
3 2013-08-25 03:00:00-04:00
4 2013-08-25 04:00:00-04:00
dtype: datetime64[ns, pytz.FixedOffset(-240)]
也可以直接解析為 UTC:
pd.to_datetime(s, utc=True)
0 2013-08-25 04:00:00+00:00
1 2013-08-25 05:00:00+00:00
2 2013-08-25 06:00:00+00:00
3 2013-08-25 07:00:00+00:00
4 2013-08-25 08:00:00+00:00
dtype: datetime64[ns, UTC]
( pd.__version__
1.3.0 )
如果您還想將所有日期轉換為 utc(更好地存儲),您可以這樣做:
df = pd.read_csv(file, sep=';', parse_dates=[0], index_col=[0],
date_parser=lambda x: pd.to_datetime(x, utc=True),
index_col=[0])
因此,您可以選擇時間:
df.loc["2013-08-25"]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.