You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用DARTS创建时间序列对象时遇缺失日期报错求助

解决Darts TimeSeries.from_dataframe的日期频率验证错误

错误原因

即使设置了fill_missing_dates=False,当指定freq='B'时,Darts仍会校验所有输入日期是否属于该频率定义的时间点集合。'B'默认对应美国标准工作日,如果你的股票数据包含其他地区的工作日(比如中国、欧洲等,节假日与美国不同),或者数据中存在不符合该频率的日期(比如误录入的周末日期),就会触发此错误。

分步解决方案

1. 先验证数据中的日期合法性

首先检查数据里是否存在非工作日或不符合目标频率的日期:

import pandas as pd

# 标记每个日期是否为周一至周五的工作日
target_pivot['is_weekday'] = target_pivot['date'].dt.weekday < 5
# 筛选出异常日期
invalid_dates = target_pivot[~target_pivot['is_weekday']]['date']
print("异常日期列表:", invalid_dates.tolist())

如果输出非空,需要清理这些异常日期后再继续。

2. 方案一:移除freq参数,让Darts自动推断频率

如果确认所有日期都是合法工作日,但和默认'B'的节假日规则不匹配,可以直接不指定freq,让Darts根据现有日期自动推断:

target_ts = TimeSeries.from_dataframe(
    target_pivot,
    time_col='date',
    value_cols=target_pivot.columns[1:].tolist(),
    fill_missing_dates=False,
    fillna_value=0,
    static_covariates=['static_covariate'],
    hierarchy=None
)

3. 方案二:自定义匹配你数据的工作日频率

如果需要明确指定频率(比如适配中国/欧洲的节假日),可以自定义CustomBusinessDay:

from pandas.tseries.offsets import CustomBusinessDay
from pandas.tseries.holiday import AbstractHolidayCalendar, Holiday, nearest_workday

# 示例:自定义中国工作日日历(需根据实际年份补充完整节假日规则)
class LocalHolidayCalendar(AbstractHolidayCalendar):
    rules = [
        Holiday('元旦', month=1, day=1, observance=nearest_workday),
        Holiday('春节', month=2, day=10, observance=nearest_workday),  # 2024年示例
        Holiday('五一劳动节', month=5, day=1, observance=nearest_workday),
        # 其他节假日...
    ]

# 创建自定义工作日频率
local_bd = CustomBusinessDay(calendar=LocalHolidayCalendar())

# 使用自定义频率创建TimeSeries
target_ts = TimeSeries.from_dataframe(
    target_pivot,
    time_col='date',
    value_cols=target_pivot.columns[1:].tolist(),
    fill_missing_dates=False,
    freq=local_bd,
    fillna_value=0,
    static_covariates=['static_covariate'],
    hierarchy=None
)

4. 方案三:绕过DataFrame直接用时间和值创建

如果上述方法仍有问题,可以先提取时间序列的时间点和数值,直接用from_times_and_values创建:

# 将date设为索引
target_pivot.set_index('date', inplace=True)

# 提取时间点和对应数值
times = target_pivot.index
values = target_pivot.values

# 创建TimeSeries对象
target_ts = TimeSeries.from_times_and_values(
    times=times,
    values=values,
    fill_missing_dates=False,
    static_covariates=['static_covariate'],
    hierarchy=None
)

内容的提问来源于stack exchange,提问作者Rick Hamilton

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 04:06:06