Python中VAR分析时出现日期解析错误的排查求助
问题排查:VAR分析中滞后相关性测试报错
Unknown datetime string format, unable to parse: tr 问题描述
我在对情绪值与收益率数据做VAR分析时,遇到以下问题:
- 加载收益率数据
tr时,因parse_dates读取异常,手动将日期索引转为DateTimeIndex;情绪数据Index通过parse_dates直接加载成功 - 为数据设置频率后,运行滞后相关性测试循环时,抛出错误:
Unknown datetime string format, unable to parse: tr
相关代码
加载收益率数据
tr = pd.read_csv("PATH", skiprows = 0 ,index_col = 1,squeeze = True, sep = ";", decimal=",") tr.index = pd.to_datetime(tr.index, format = "%Y-%m-%d") tr = tr.reset_index() tr["quarter"] = tr["quarter"].apply(lambda x: x.strftime('%Y-%m')) tr.set_index('quarter', inplace=True) tr.index = pd.to_datetime(tr.index, format = "%Y-%m")
加载情绪数据
Index = pd.read_csv("PATH", parse_dates = [0], index_col = 0, skiprows = 0 ,squeeze = True, sep = ";", decimal=",")
设置频率
tr = tr.asfreq(pd.infer_freq(tr.index)) Index = Index.asfreq(pd.infer_freq(Index.index))
滞后相关性测试
for lag in range (1, 24): tr = tr["return"].iloc[lag:] lagged_opt = Index["Sentiment"].iloc[:-lag] print("lag: %s"%lag) print(pearsonr(tr, lagged_opt)) print("-------")
报错原因
循环内的tr = tr["return"].iloc[lag:]是核心问题:
- 第一次循环时,
tr原本是带索引的DataFrame,执行该行后,tr被覆盖为Series(仅保留return列的切片数据) - 第二次循环时,再次执行
tr["return"],此时tr是Series且索引为日期类型,Python会尝试将字符串"return"解析为日期,最终因格式不匹配抛出解析错误(报错信息中的tr应为显示误差,实际是解析"return"失败)
修复方案
不要在循环中覆盖原始的tr变量,改用临时变量存储切片后的数据:
# 提前提取需要的列,避免循环内重复操作 tr_return = tr["return"] index_sentiment = Index["Sentiment"] for lag in range(1, 24): current_tr = tr_return.iloc[lag:] lagged_opt = index_sentiment.iloc[:-lag] print(f"lag: {lag}") print(pearsonr(current_tr, lagged_opt)) print("-------")
额外优化建议
- 检查
tr和Index的索引是否完全对齐,避免因长度不一致导致计算错误 - 可以用
pd.Series.shift()实现滞后操作,代码更简洁且自动处理缺失值:
tr_return = tr["return"] index_sentiment = Index["Sentiment"] for lag in range(1, 24): lagged_sentiment = index_sentiment.shift(lag) # 合并后删除缺失值,保证序列长度一致 combined_data = pd.concat([tr_return, lagged_sentiment], axis=1).dropna() print(f"lag: {lag}") print(pearsonr(combined_data["return"], combined_data["Sentiment"])) print("-------")
内容的提问来源于stack exchange,提问作者Schlaeggi
相关产品推荐
相关产品推荐

