为了账号安全,请及时绑定邮箱和手机立即绑定

将可识别熊猫时区的DateTimeIndex转换为朴素的时间戳,但在特定时区

将可识别熊猫时区的DateTimeIndex转换为朴素的时间戳,但在特定时区

慕慕森 2019-10-10 17:00:33
您可以使用该函数tz_localize来识别Timestamp或DateTimeIndex时区,但如何相反:如何在保留时区的情况下将时区识别的Timestamp转换为朴素的时间戳?一个例子:In [82]: t = pd.date_range(start="2013-05-18 12:00:00", periods=10, freq='s', tz="Europe/Brussels")In [83]: tOut[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 = NoneIn [87]: tOut[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]: dOut[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]: tOut[124]: <class 'pandas.tseries.index.DatetimeIndex'>[2013-05-18 12:00:00, ..., 2013-05-18 12:00:09]Length: 10, Freq: S, Timezone: Europe/BrusselsIn [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
查看完整描述

3 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

我认为您无法以比拟议的方式更有效的方式实现所需的目标。


潜在的问题是时间戳(如您所知)由两部分组成。表示UTC时间和时区tz_info的数据。当在屏幕上打印时区时,时区信息仅用于显示目的。在显示时,数据会适当偏移,并将+01:00(或类似值)添加到字符串中。剥离tz_info值(使用tz_convert(tz = None))实际上并不会改变表示时间戳幼稚部分的数据。


因此,执行所需操作的唯一方法是修改基础数据(熊猫不允许这样做……DatetimeIndex是不可变的–请参见DatetimeIndex的帮助),或创建一组新的时间戳对象并包装它们在新的DatetimeIndex中。您的解决方案将执行以下操作:


pd.DatetimeIndex([i.replace(tzinfo=None) for i in t])

作为参考,以下是replace方法Timestamp(请参阅tslib.pyx):


def replace(self, **kwds):

    return Timestamp(datetime.replace(self, **kwds),

                     offset=self.offset)

您可以参考文档上的内容datetime.datetime,它datetime.datetime.replace还会创建一个新对象。


如果可以的话,提高效率的最佳选择是修改数据源,以使它(错误地)报告没有时区的时间戳。您提到:


我想使用时区朴素的时间序列(以避免额外的时区麻烦,在我正在处理的情况下,我不需要它们)


我很好奇您指的是什么额外的麻烦。作为所有软件开发的一般规则,我建议您将时间戳记“天真值”保持在UTC中。没有什么比查看两个不同的int64值(它们属于哪个时区)更糟糕的了。如果您始终始终使用UTC作为内部存储,那么将避免无数的麻烦。我的口头禅是时区仅是人类的I / O。


查看完整回答
反对 回复 2019-10-10
  • 3 回答
  • 0 关注
  • 587 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信