【问题标题】:How to get a periodic time series at a fixed time across a DST boundary?如何跨 DST 边界在固定时间获取周期性时间序列?
【发布时间】:2014-07-02 06:03:54
【问题描述】:

Python 的 Pandas 能够使用 (at least) date_range 函数提供规则间隔的时间间隔:

>>> import pandas as pd
>>> import pytz, datetime
>>> from pprint import pprint as pp
>>> tzto = pytz.timezone("America/Toronto")
>>> oct17 = tzto.localize(datetime.datetime(2014, 10, 17, 8))
>>> #get every Friday from Oct 17 (a Friday) for 5 weeks...
>>> pp(pd.date_range(oct17, periods=5, freq="W-FRI").tolist())
[Timestamp('2014-10-17 08:00:00-0400', tz='America/Toronto'),
 Timestamp('2014-10-24 08:00:00-0400', tz='America/Toronto'),
 Timestamp('2014-10-31 08:00:00-0400', tz='America/Toronto'),
 Timestamp('2014-11-07 07:00:00-0500', tz='America/Toronto'),
 Timestamp('2014-11-14 07:00:00-0500', tz='America/Toronto')]

很遗憾,当间隔跨越 DST 更改时,初始时间会丢失。如上图所示,由于 2014 年 11 月 2 日多伦多的 DST 计划更改,上述最后两个条目已移回早上 7 点。

如何构建系列以保持跨 DST 边界的时间相同?即:在上面的示例中,上面的每个条目都应该是早上 8 点,而不是在 DST 跳转后转移到早上 7 点。

【问题讨论】:

    标签: python pandas timezone


    【解决方案1】:

    为此,开始日期时间必须是幼稚的。通过将tz 关键字参数传递给date_range(),在生成系列之后本地化时区:

    >>> import pandas as pd
    >>> import pytz, datetime
    >>> from pprint import pprint as pp
    >>> tzto = pytz.timezone("America/Toronto")
    >>> oct17_naive = datetime.datetime(2014, 10, 17, 8, 0, 0)
    >>> pp(pd.date_range(oct17_naive, periods=5, freq="W-FRI", tz=tzto).tolist())
    [Timestamp('2014-10-17 08:00:00-0400', tz='America/Toronto'),
     Timestamp('2014-10-24 08:00:00-0400', tz='America/Toronto'),
     Timestamp('2014-10-31 08:00:00-0400', tz='America/Toronto'),
     Timestamp('2014-11-07 08:00:00-0500', tz='America/Toronto'),
     Timestamp('2014-11-14 08:00:00-0500', tz='America/Toronto')]
    

    以上所有时间都是上午 8 点,即使是 11 月 2 日的夏令时跳跃。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-02
      • 2011-11-14
      • 2017-06-29
      • 2020-03-07
      • 1970-01-01
      • 2020-05-07
      • 2017-05-02
      相关资源
      最近更新 更多