Pandas拼接含本地化时间与NaT的DataFrame时如何保持类型与时区一致
问题:拼接带时区和含NaT的DataFrame后保留本地化时间列
我需要拼接两个含时间序列的pandas DataFrame,但遇到了类型问题:其中一个DataFrame的时间列是带America/New_York时区的本地化时间戳,另一个的时间列全为NaT。拼接后时间列类型从datetime64[ns]变为object,无法进行后续分析。尝试本地化第二个DataFrame的时间列时还触发了TypeError。
示例代码
import pandas as pd a = pd.DataFrame( { 'DateTime': pd.date_range( start='2022-10-10', periods=7, freq='1D', tz='America/New_York' ), 'Value': range(7) } ) b = pd.DataFrame( { 'DateTime': pd.NaT, 'Value': range(10,20), } ) c = pd.concat([a, b], axis=0, ignore_index=True)
数据类型差异
两个DataFrame的时间列类型不一致:
>>> print(a.dtypes) DateTime datetime64[ns, America/New_York] Value int64 dtype: object >>> print(b.dtypes) DateTime datetime64[ns] Value int64 dtype: object
拼接后的问题
拼接后时间列类型变为object:
>>> print(c.dtypes) DateTime object Value int64 dtype: object
尝试本地化时的错误
直接调用tz_localize会触发类型错误:
>>> b['DateTime'] = b['DateTime'].tz_localize('America/New_York') Traceback (most recent call last): File "/tmp/so-pandas-nat.py", line 27, in <module> b['DateTime'] = b['DateTime'].tz_localize('America/New_York') File ".venv/lib/python3.10/site-packages/pandas/core/generic.py", line 9977, in tz_localize ax = _tz_localize(ax, tz, ambiguous, nonexistent) File ".venv/lib/python3.10/site-packages/pandas/core/generic.py", line 9959, in _tz_localize raise TypeError( TypeError: index is not a valid DatetimeIndex or PeriodIndex
解决方案
方法1:创建DataFrame时直接指定带时区的NaT列
创建b时,明确生成带目标时区的NaT序列,确保和a的时间列类型一致:
b = pd.DataFrame( { # 生成10个带America/New_York时区的NaT值 'DateTime': pd.Series([pd.NaT]*10, dtype='datetime64[ns, America/New_York]'), 'Value': range(10,20), } )
此时再执行pd.concat([a, b], axis=0, ignore_index=True),结果的DateTime列会保留datetime64[ns, America/New_York]类型。
方法2:修改已有DataFrame的时间列类型
对已存在的b,直接将时间列转换为带目标时区的类型:
b['DateTime'] = b['DateTime'].astype('datetime64[ns, America/New_York]')
或者使用dt访问器的tz_localize方法(适合非全NaT的情况):
b['DateTime'] = b['DateTime'].dt.tz_localize('America/New_York')
修改后再拼接,即可保留本地化时间列类型。
内容的提问来源于stack exchange,提问作者Phenyl
相关产品推荐
相关产品推荐

