Darts转换DatetimeIndex DataFrame为Series索引变object解决方法
问题背景
存储逐小时温度测量数据的DataFrame结构如下:
df.info() <class 'pandas.core.frame.DataFrame'> DatetimeIndex: 17545 entries, 2020-01-01 00:00:00+00:00 to 2022-01-01 00:00:00+00:00 Data columns (total 1 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 T (degC) 17545 non-null float64 dtypes: float64(1) memory usage: 274.1 KB
使用如下代码将DataFrame转换为Darts的TimeSeries对象:
df_series = TimeSeries.from_dataframe(df) df_series
转换后无法执行绘图操作,抛出如下类型错误:
TypeError: Plotting requires coordinates to be numeric, boolean, or dates of type numpy.datetime64, datetime.datetime, cftime.datetime or pandas.Interval. Received data of type object instead.
根据Darts官方文档说明,未指定time_col参数时会直接使用DataFrame原有的DatetimeIndex转换,但实际转换后时间索引变为object类型,导致绘图失败。
故障原因
核心诱因是DataFrame的DatetimeIndex携带了时区标记:从df.info()输出可见,索引时间末尾带+00:00的UTC时区偏移,属于时区感知型时间索引。Darts的from_dataframe()方法默认不会自动剥离时区信息,转换后内部时间坐标会被识别为object类型,不符合绘图接口要求的合法时间数据类型,因此抛出类型错误。
修复方案
方案1:转换前移除索引时区(推荐)
在生成TimeSeries前,先将DataFrame索引转为无时区的datetime64类型,代码如下:
# 移除索引时区,转换为原生datetime64格式 df.index = df.index.tz_localize(None) # 执行转换 df_series = TimeSeries.from_dataframe(df)
转换完成后即可正常调用绘图方法,不会再触发类型错误。
方案2:转换时显式指定时间频率,强制标准化时间索引
如果需要保留原始时区信息,可以在转换时开启缺失日期填充参数,同时显式指定数据采样频率,强制Darts对时间索引做标准化解析:
df_series = TimeSeries.from_dataframe( df, fill_missing_dates=True, freq="h" )
注意:如果数据不是小时级采样,需要将
freq参数替换为实际采样频率,例如日频数据传入"D"、15分钟间隔数据传入"15min"即可。
转换完成后可执行print(df_series.time_index.dtype)验证,输出为datetime64[ns]即代表时间类型符合要求。
内容的提问来源于stack exchange,提问作者MarcoWirtl
相关产品推荐
相关产品推荐

