簡體   English   中英

如何在熊貓中讀取帶有時區的日期時間

[英]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/4318671x.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.

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