20

我正在尝试从 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

谁能解释我如何将日期时间与时区分开?

4

4 回答 4

26

Pandas 解析器将考虑时区信息(如果可用),并为您提供一个简单的时间戳(naive == 无时区信息),但会考虑时区偏移量。

要将时区信息保留在 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将拆分字符串并仅将日期时间部分传递给解析器的 a。

>>> 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)
于 2013-09-20T08:57:13.673 回答
0

如果您在导入 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 )

于 2021-08-26T16:12:46.463 回答
0

如果你正在使用pandas,你可以试试

df['time'] = pd.to_datetime(df['time'])
于 2019-12-03T05:59:25.027 回答
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"]
于 2022-01-14T09:03:13.863 回答