【问题标题】:Timestamps with different timezones in the same pandas DatetimeIndex object?同一个熊猫 DatetimeIndex 对象中具有不同时区的时间戳?
【发布时间】:2016-01-09 06:35:31
【问题描述】:

是否可以将由单个时区中的时间戳组成的 pd.DatetimeIndex 转换为每个时间戳都有自己的时区,在某些情况下是不同的时区?

这是我想要的示例:

类型(df.index)

 pandas.tseries.index.DatetimeIndex

df.index[0]

Timestamp('2015-06-07 23:00:00+0100', tz='Europe/London')

df.index[1]

Timestamp('2015-06-08 00:01:00+0200', tz='Europe/Brussels') 

【问题讨论】:

  • 请展示您想要的示例

标签: python datetime pandas pytz


【解决方案1】:

将具有不同时区的时间戳添加到同一个DatetimeIndex 中会自动生成一个DatetimeIndex,其中UTC 作为默认时区。例如:

In [269]  index = pandas.DatetimeIndex([Timestamp('2015-06-07 23:00:00+0100')])

In [270]  index
Out[270]  DatetimeIndex(['2015-06-07 23:00:00+01:00'], dtype='datetime64[ns, pytz.FixedOffset(60)]', freq=None)

In [271]  index2 = DatetimeIndex([Timestamp('2015-06-08 00:01:00+0200')])

In [272]  index2
Out[272]  DatetimeIndex(['2015-06-08 00:01:00+02:00'], dtype='datetime64[ns, pytz.FixedOffset(120)]', freq=None)

In [273]  index.append(index2)  # returns single index containing both data
Out[273]  DatetimeIndex(['2015-06-07 22:00:00+00:00', '2015-06-07 22:01:00+00:00'], dtype='datetime64[ns, UTC]', freq=None)

请注意,结果如何是 UTC DatetimeIndex,并保留了正确的 UTC 时间戳。

同样:

In [279]  pandas.to_datetime([Timestamp('2015-06-07 23:00:00+0100'), Timestamp('2015-06-08 00:01:00+0200')], utc=True)  # utc=True is needed
Out[279]  DatetimeIndex(['2015-06-07 22:00:00+00:00', '2015-06-07 22:01:00+00:00'], dtype='datetime64[ns, UTC]', freq=None)

这不是一件坏事,因为您可以保留正确的时间,同时能够使用 DatetimeIndex 的索引能力(例如按日期范围切片),同时您可以轻松地将时间戳转换为任何其他时区(除非您真的需要知道每个时间戳的原始时区,否则这并不理想)。

【讨论】:

    【解决方案2】:

    可以拥有一个包含不同时区的Timestamps 的索引。但是您必须明确地将其构造为Index

    In [33]: pd.Index([pd.Timestamp('2015-06-07 23:00:00+0100', tz='Europe/London'),pd.Timestamp('2015-06-08 00:01:00+0200', tz='Europe/Brussels')],dtype='object')
    Out[33]: Index([2015-06-07 23:00:00+01:00, 2015-06-08 00:01:00+02:00], dtype='object')
    
    In [34]: list(pd.Index([pd.Timestamp('2015-06-07 23:00:00+0100', tz='Europe/London'),pd.Timestamp('2015-06-08 00:01:00+0200', tz='Europe/Brussels')],dtype='object'))  
    Out[34]: 
    [Timestamp('2015-06-07 23:00:00+0100', tz='Europe/London'),
     Timestamp('2015-06-08 00:01:00+0200', tz='Europe/Brussels')]
    

    这是一件非常奇怪的事情,而且完全没有表现。您通常希望有一个 single 时区表示(UTC 或其他)。在 0.17.0 中,您可以有效地表示具有时区的单个列,因此实现我认为您的目标的一种方法是将不同的时区分隔到不同的列中。见docs

    【讨论】:

    • 感谢@Jeff,我同意您关于尽可能避免在索引中使用本地时间的建议。然而,在某些情况下,我们想要解决的科学问题可能与本地时间相关的现象有关。我试图提出一个具体的例子。你能看看stackoverflow.com/questions/33201680/…
    • 我会回答你的其他问题。您只需将时间保存在单独的列中 - 您不需要设置为索引(或者您可能有 utc 作为索引)
    【解决方案3】:

    如果你很高兴它不是Index,而只是一个普通的Series,这应该没问题:

    pd.Series([pd.Timestamp('2015-06-07 23:00:00+0100', tz='Europe/London'),
               pd.Timestamp('2015-06-08 00:01:00+0200', tz='Europe/Brussels')])
    

    【讨论】:

      猜你喜欢
      • 2021-11-20
      • 1970-01-01
      • 2021-06-27
      • 2013-05-13
      • 2019-07-16
      • 2012-02-04
      • 2014-10-31
      • 2014-10-28
      相关资源
      最近更新 更多