由于时区信息已被numpy弃用,datetime64构造函数,转换ISO 8601日期字符串的正确方法是什么?

sxpgvts3  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(94)

我有一个包含大量ISO 8601日期字符串的时间序列,希望转换为numpy.datetime64。但我得到一个警告:

>>> import numpy as np
>>> t=np.datetime64('2022-05-01T00:00:00-07:00')
<stdin>:1: DeprecationWarning: parsing timezone aware datetimes is deprecated; this will raise an error in the future

好的,那么我如何避免警告?(不放弃重要的性能因素)

(大概这样做的方法是转换为UTC,然后创建一个datetime64对象,但使用datetime64的全部意义在于它可以非常快地直接处理ISO 8601字符串。)
The documentation mentions this issue,但不建议任何解决方案:
自版本1起弃用。11.0:NumPy不存储时区信息。为了向后兼容,datetime64仍然解析时区偏移,它通过转换为UTC±00:00(祖鲁时间)来处理。此行为已被弃用,将来会引发错误。

sf6xfgos

sf6xfgos1#

我找到了一种方法来做到这一点,但它明显慢了(我不在乎〈10000个时间戳,但对于数百万或更多的时间,我希望保持快速的时间)。
在Jupyter notebook中:

import datetime 
import pandas as pd

def iso_to_datetime64_1(iso):
    return np.datetime64(iso)

def iso_to_datetime64_2(iso):
    return np.datetime64(datetime.datetime.fromisoformat(iso)
                          .astimezone(datetime.timezone.utc)
                          .replace(tzinfo=None))

def iso_to_datetime64_3(iso):
    return pd.Timestamp(iso).to_datetime64()

test_time = '2022-05-01T00:00:00.123-07:00'
for f in [iso_to_datetime64_1, iso_to_datetime64_2, iso_to_datetime64_3]:
    print(f(test_time))
    %timeit f(test_time)

它打印出:

2022-05-01T07:00:00.123
574 ns ± 2.11 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
2022-05-01T07:00:00.123000
3.32 µs ± 27.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
2022-05-01T07:00:00.123000000
6.94 µs ± 44.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

相关问题