【发布时间】:2015-05-29 22:13:54
【问题描述】:
我需要快速将 ISO 8601 日期时间字符串(字符串中没有时区,但已知位于美国/太平洋时区)转换为 numpy datetime64 对象。
如果我的机器在美国/太平洋时间,我可以简单地运行numpy.datetime64(s)。但是,这假定没有时区的字符串位于本地时区。此外,我不能轻易地以 ISO 8601 格式指定美国/太平洋时区,因为它有时是 -0800,有时是 -0700,具体取决于夏令时。
到目前为止,我最快的解决方案是numpy.datetime64(pandas.Timestamp(s).tz_localize(tz='US/Pacific', ambiguous=True))。这在我的机器上需要 70µs。如果我能把这个速度至少提高一个数量级就好了(numpy.datetime64(s) 在本地时间需要 4 µs,但如上所述是不正确的)。这可能吗?
【问题讨论】:
-
如果性能是一个问题,您一定要这样做数百万次,对吧?每次的偏移量都一样吗?如果是这样,也许只需在所有这些上使用
numpy.datetime64(s),然后使用 numpy 算术将它们全部移动相同的偏移量。 -
@unutbu:不幸的是,偏移量不一定相同:有些日期时间在 DST 期间,有些则不是。此外,似乎即使我自己计算每个日期时间的 DST 调整也容易出错?
-
我不确定。我还没有找到更快的方法。但无论如何,请注意
np.datetime64(pd.Timestamp(s, tz='US/Pacific'))可能不会给您想要的结果。考虑 ISO 8601 日期时间字符串'2000-04-02T03:00:00-07:00'。如果没有时区,您将拥有s = '2000-04-02T03:00:00'。但是np.datetime64(pd.Timestamp(s, tz='US/Pacific'))返回numpy.datetime64('2000-04-02T04:00:00.000000-0700'),所以这不是正确的往返。 -
你的操作系统是什么? Python版本?
numpy版本?pandas版本?可以升级吗? -
@unutbu:很好地抓住了错误!正确的电话是
np.datetime64(pd.Timestamp(s).tz_localize(tz=tz, ambiguous=True)),这与您的答案中的更快方法一致,但比原来的方法慢了近 2 倍(因此比您的结果慢 200 倍)。
标签: python performance datetime optimization numpy