使用Pandas resample重采样时间序列遇无效频率错误的咨询
Pandas resample 报错
ValueError: Invalid frequency: 65.117651L 的原因及解决办法 问题复现
使用Pandas的resample方法对时间序列重采样时,通过总时长除以间隔数计算步长,偶尔会触发如下错误:
ValueError: Invalid frequency: 65.117651L
可通过以下代码复现该问题:
import pandas as pd from pandas import DatetimeIndex index = DatetimeIndex(['2023-09-14 10:41:11.816999936', '2023-09-14 10:41:12.002000128', '2023-09-14 10:41:12.101999872', '2023-09-14 10:41:12.112999936', '2023-09-14 10:41:12.210000128', '2023-09-14 10:41:12.308999936', '2023-09-14 10:41:12.311000064', '2023-09-14 10:41:12.408999936', '2023-09-14 10:41:12.424000', '2023-09-14 10:41:12.523000064', '2023-09-14 10:41:12.828000', '2023-09-14 10:41:12.829999872', '2023-09-14 10:41:12.924000'], dtype='datetime64[ns]', name='TS', freq=None) pd.DataFrame(index=index).resample('65.117651L')
原因分析
- 浮点数精度导致解析异常:Pandas解析字符串格式的频率时,会将毫秒级浮点值转换为纳秒级整数。
65.117651L对应65.117651毫秒,理论上等于65117651纳秒,但浮点数的二进制存储特性会引入微小误差,导致实际转换后的数值不符合Pandas对有效频率的校验规则。 - 频率的离散性要求:
resample依赖规则的时间间隔,当计算出的步长无法被精确转换为整数纳秒(或存在精度丢失)时,会被判定为无效频率。微调数值后,误差刚好被抵消,能转换为合法的纳秒整数,因此错误消失。
解决办法
- 直接使用纳秒整数指定频率:跳过浮点字符串解析环节,将计算出的毫秒值精确转换为纳秒整数后传入,例如
resample('65117651N')(N代表纳秒单位)。 - 对频率值做四舍五入处理:计算步长后,对浮点数值保留合理小数位(比如4位),例如
resample('65.1177L'),避免精度触发校验错误。 - 使用Timedelta对象替代字符串频率:直接构造
pd.Timedelta对象传入,彻底避开字符串解析的精度问题,示例代码:pd.DataFrame(index=index).resample(pd.Timedelta(milliseconds=65.117651))
内容的提问来源于stack exchange,提问作者Guido
相关产品推荐
相关产品推荐

