转换np.datetime64的时区而不会损失精度

时间:2019-05-22 09:28:39

标签: python numpy datetime timezone

我有一个DataFrame,其中一列的类型为datetime64 [ns]。这些代表“欧洲/伦敦”时区中的时间,并且处于纳秒级的精度。 (数据来自外部系统)

我需要将它们转换为代表 UTC 时间的datetime64 [ns]条目。因此,换句话说,每天要增加0或1小时,具体取决于条目是否在夏季。

做到这一点的最佳方法是什么?

不幸的是,我找不到对np.datetime64的任何时区支持。同时,我不能直接转换为datetime.datetime对象,也不能使用datetime.datetime对象,因为这意味着精度下降。到目前为止,我唯一能想到的就是将np.datetime64转换为datetime.datetime,调整时区,在未调整和调整后的datetime.datetime之间获取某种timedelta,然后将其应用于np.datetime64。听起来像是一大堆麻烦,我希望可以更轻松地完成某些事情?

谢谢!

1 个答案:

答案 0 :(得分:2)

pandas似乎使用dt访问器对此提供了一些内置支持:

import pandas as pd
import numpy as np

dt_arr = np.array(['2019-05-01T12:00:00.000000010',
                   '2019-05-01T12:00:00.000000100',],
                  dtype='datetime64[ns]')

df = pd.DataFrame(dt_arr)

# Represent naive datetimes as London time
df[0] = df[0].dt.tz_localize('Europe/London')

# Convert to UTC
df[0] = df[0].dt.tz_convert("UTC")

print(df)
                                    # 0
# 0 2019-05-01 11:00:00.000000010+00:00
# 1 2019-05-01 11:00:00.000000100+00:00

假设您以np.datetime64[ns]中的一些ISO 8601字符串开头,则可以使用dt.tz_localize为它们分配一个时区,然后使用dt.tz_convert将它们转换为另一个时区。

我会警告说,如果它们以1556708400000000010之类的整数形式出现,则很有可能它们已经 表示UTC,因为以秒或纳秒为单位的时间戳通常为{{3 }},它们与记录的时区无关(在Unix时代之后的秒数/纳秒,而不是民用时间)。