Pandas 1.3.4中DateTime线性插值的正确实现(解决FutureWarning)
解决Pandas 1.3.4中datetime转int64的FutureWarning问题
问题背景
使用Pandas 1.3.4版本,现有代码可将非单调时间戳插值到带单调浮点型时间索引的DataFrame out中,但运行时抛出FutureWarning,提示将datetime64[ns]转int64时应使用.view()替代.astype('int64')。但Pandas 1.3.4的DataFrame没有.view()方法,且无法升级版本,需找到兼容的实现方式。
原核心代码:
out = out.join(dateTime_df.astype('int64'), how = 'outer', ).interpolate(method = 'linear', limit_area = 'inside', ).loc[index] #`index` is the monotonous time index out["DateTime_col"] = out["DateTime_col"].astype('<M8[ns]')
抛出的警告:
FutureWarning: casting datetime64[ns] values to int64 with .astype(...) is deprecated and will raise in a future version. Use .view(...) instead.
测试数据:
import pandas as pd import numpy as np import datetime out = pd.DataFrame(np.random.rand(10, 3), columns = ['previously', 'imported', 'data']) dateTime_df = pd.DataFrame([datetime.datetime.now() - datetime.timedelta(days = 1), datetime.datetime.now()], index = [3, 7], columns = ["DateTime_col"]) index = np.arange(10)
解决方案
Pandas 1.3.4中DataFrame虽无.view()方法,但Series有该方法。因此可以单独提取时间列转为整数型Series后再进行join和插值操作,具体步骤如下:
- 提取
dateTime_df中的DateTime_col列,使用.view('int64')转为整数型(保持原索引) - 将转换后的Series与
out进行outer join - 执行线性插值(限制仅在已有数据区间内插值)
- 筛选目标索引后,将
DateTime_col转回datetime64[ns]类型
修改后的核心代码:
# 单独处理时间列,用Series的view转int64 datetime_series = dateTime_df["DateTime_col"].view('int64') # 执行join、插值、索引筛选 out = out.join(datetime_series, how='outer') \ .interpolate(method='linear', limit_area='inside') \ .loc[index] # 转回datetime类型 out["DateTime_col"] = out["DateTime_col"].view('<M8[ns]')
验证说明
运行修改后的代码,既可以完成时间戳的线性插值,又不会触发FutureWarning。插值后的DateTime_col列会在索引3到7之间生成连续的时间值,符合预期需求。
内容的提问来源于stack exchange,提问作者Daniel F
相关产品推荐
相关产品推荐

