将pandas列datetime64的时区从UTC转换为America/New_York



我尝试了以下更改时区熊猫数据框:

print(df['column_datetime'].dtypes)
print(df['column_datetime'].tz_localize('America/New_York').dtypes)
print(df['column_datetime'].tz_convert('America/New_York').dtypes)

这给了我:

datetime64[ns, UTC]
datetime64[ns, UTC]
Traceback (most recent call last):
File "/home/ubuntu/.local/lib/python3.6/site-packages/pandas/core/generic.py", line 9484, in tz_convert
ax = _tz_convert(ax, tz)
File "/home/ubuntu/.local/lib/python3.6/site-packages/pandas/core/generic.py", line 9472, in _tz_convert
ax = ax.tz_convert(tz)
File "/home/ubuntu/.local/lib/python3.6/site-packages/pandas/core/indexes/extension.py", line 78, in method
result = attr(self._data, *args, **kwargs)
File "/home/ubuntu/.local/lib/python3.6/site-packages/pandas/core/arrays/datetimes.py", line 803, in tz_convert
"Cannot convert tz-naive timestamps, use tz_localize to localize"
TypeError: Cannot convert tz-naive timestamps, use tz_localize to localize

两个问题:

  1. 为什么tz_localize不返回datetime64[ns,America/New_York]
  2. 为什么tz_convert说时间戳是tz-naive当dtypes显示UTC?

编辑:这个问题的答案实际上通过使用tz_convert解决了这个问题。

import numpy as np
import pandas as pd
x = pd.Series(np.datetime64('2005-01-03 14:30:00.000000000'))
y = x.dt.tz_localize('UTC')
z = y.dt.tz_convert('America/New_York')
z
---
0   2005-01-03 09:30:00-05:00
dtype: datetime64[ns, America/New_York]

这种情况只有在您的数据框架具有tz naive datetime索引时才有可能发生。

import pandas as pd
df = pd.DataFrame({'column_datetime': pd.to_datetime('2005-01-03 14:30', utc=True)},
index=[pd.to_datetime('2005-01-03 14:30')])
print(df['column_datetime'].dtypes)
print(df['column_datetime'].tz_localize('America/New_York').dtypes)
print(df['column_datetime'].tz_convert('America/New_York').dtypes)

回答你的问题:

1。为什么tz_localize不返回datetime64[ns,America/New_York]?

tz_localize本地化索引,而不是序列的值(对于后者,您需要dt访问器,正如您已经发现的那样)。您可以通过打印df['column_datetime'].tz_localize('America/New_York').index.dtype(即datetime64[ns, America/New_York])来验证这一点。您打印了在此操作中未更改的值的类型。

此行为在tz_localize的文档中有明确描述:

该操作将索引本地化。对a中的值进行本地化timezone-naive系列,使用Series.dt.tz_localize()

2。为什么tz_convert说时间戳是z-naive而dtypes显示UTC?

原因与1相同。-它尝试转换没有时区的索引。这里的文档没有tz_localize那么清楚。

最新更新