python - 将 pandas 时区感知的 DateTimeIndex 转换为天真的时间戳,但在特定时区

标签 python pandas datetime timezone

您可以使用函数 tz_localize 来识别 Timestamp 或 DateTimeIndex 时区,但如何做相反的事情:如何将时区识别 Timestamp 转换为天真的 Timestamp,同时保留其时区?

一个例子:

In [82]: t = pd.date_range(start="2013-05-18 12:00:00", periods=10, freq='s', tz="Europe/Brussels")

In [83]: t
Out[83]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-05-18 12:00:00, ..., 2013-05-18 12:00:09]
Length: 10, Freq: S, Timezone: Europe/Brussels

我可以通过将时区设置为 None 来删除时区,但随后结果会转换为 UTC(12 点变为 10 点):

In [86]: t.tz = None

In [87]: t
Out[87]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-05-18 10:00:00, ..., 2013-05-18 10:00:09]
Length: 10, Freq: S, Timezone: None

是否有另一种方法可以将 DateTimeIndex 转换为朴素时区,但同时保留它设置的时区?

<小时/>

关于我问这个问题的一些背景:我想使用时区天真的时间序列(以避免时区的额外麻烦,并且我不需要它们来处理我正在处理的情况).
但由于某种原因,我必须处理本地时区(欧洲/布鲁塞尔)中的时区感知时间序列。由于我的所有其他数据都是时区天真的(但以我的本地时区表示),我想将此时间序列转换为天真以进一步使用它,但它也必须以我的本地时区表示(因此只需删除时区信息,而不将用户可见时间转换为 UTC)。

我知道时间实际上是内部存储为 UTC 的,并且只有在表示它时才会转换为另一个时区,因此当我想要“非本地化”它时必须进行某种转换。例如,使用 python datetime 模块,您可以像这样“删除”时区:

In [119]: d = pd.Timestamp("2013-05-18 12:00:00", tz="Europe/Brussels")

In [120]: d
Out[120]: <Timestamp: 2013-05-18 12:00:00+0200 CEST, tz=Europe/Brussels>

In [121]: d.replace(tzinfo=None)
Out[121]: <Timestamp: 2013-05-18 12:00:00> 

因此,基于此,我可以执行以下操作,但我认为在处理较大的时间序列时这不会非常有效:

In [124]: t
Out[124]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-05-18 12:00:00, ..., 2013-05-18 12:00:09]
Length: 10, Freq: S, Timezone: Europe/Brussels

In [125]: pd.DatetimeIndex([i.replace(tzinfo=None) for i in t])
Out[125]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-05-18 12:00:00, ..., 2013-05-18 12:00:09]
Length: 10, Freq: None, Timezone: None

最佳答案

为了回答我自己的问题,此功能已同时添加到 pandas 中。 从 pandas 0.15.0 开始,您可以使用 tz_localize(None) 删除时区,从而得到本地时间。
请参阅最新消息条目:http://pandas.pydata.org/pandas-docs/stable/whatsnew.html#timezone-handling-improvements

以我上面的例子为例:

In [4]: t = pd.date_range(start="2013-05-18 12:00:00", periods=2, freq='H',
                          tz= "Europe/Brussels")

In [5]: t
Out[5]: DatetimeIndex(['2013-05-18 12:00:00+02:00', '2013-05-18 13:00:00+02:00'],
                       dtype='datetime64[ns, Europe/Brussels]', freq='H')

使用tz_localize(None)删除时区信息,导致本地时间:

In [6]: t.tz_localize(None)
Out[6]: DatetimeIndex(['2013-05-18 12:00:00', '2013-05-18 13:00:00'], 
                      dtype='datetime64[ns]', freq='H')

此外,您还可以使用 tz_convert(None) 删除时区信息,但转换为 UTC,从而生成原始 UTC 时间:

In [7]: t.tz_convert(None)
Out[7]: DatetimeIndex(['2013-05-18 10:00:00', '2013-05-18 11:00:00'], 
                      dtype='datetime64[ns]', freq='H')
<小时/>

这比 datetime.replace 解决方案性能更高:

In [31]: t = pd.date_range(start="2013-05-18 12:00:00", periods=10000, freq='H',
                           tz="Europe/Brussels")

In [32]: %timeit t.tz_localize(None)
1000 loops, best of 3: 233 µs per loop

In [33]: %timeit pd.DatetimeIndex([i.replace(tzinfo=None) for i in t])
10 loops, best of 3: 99.7 ms per loop

关于python - 将 pandas 时区感知的 DateTimeIndex 转换为天真的时间戳,但在特定时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56716453/

相关文章:

python - 用户如何将自己的值添加到 dash_core_components.Dropdown 中?

Python:打印句子的第三个字母

python - 使用 pandas 删除数据行会增加内存使用量

datetime - Dart -两个不同的日期在天中产生相同的差异

python - 如何在 python/pandas 中的毫秒部分中转换带有逗号 (,) 的日期时间字符串?

c# - 语言间的方法差异(Python->C#)

python - 根据日期拆分数据框

python - 如何矢量化 Pandas 函数,该函数计算属于一个组且介于两个日期之间的行?

python - 根据与行值的比较在 DataFrame 中创建新列

html - Django 模板转换 datetime-local 格式