如何提取pandas infer_freq返回频率字符串中的数字
问题说明
通过pd.infer_freq(df.index)获取时间序列频率时,返回值是「数字+单位」格式的字符串,例如示例中5秒间隔的序列返回值为5S。直接调用int()转换该字符串会触发报错:
ValueError: invalid literal for int() with base 10: '5S'
测试复现代码如下:
import pandas as pd xdf = pd.DataFrame({'data':range(0,6)},index=pd.date_range('2022-06-03 00:00:00', '2022-06-03 00:00:25', freq='5s')) print(pd.infer_freq(xdf.index)) # 下面这行转换会报错 tf = int(pd.infer_freq(xdf.index))
预期目标是从频率字符串中提取数字部分,示例中期望得到tf = 5。
实现方案
最通用稳妥的方式是用正则匹配字符串开头的连续数字段,兼容所有pandas支持的频率字符串格式,同时可以兼容无数字前缀的基础频率(比如S代表1秒、D代表1天这类场景)。
import pandas as pd import re xdf = pd.DataFrame({'data':range(0,6)},index=pd.date_range('2022-06-03 00:00:00', '2022-06-03 00:00:25', freq='5s')) freq_str = pd.infer_freq(xdf.index) match_num = re.match(r'(\d+)', freq_str) # 匹配到数字就转成int,没匹配到说明间隔是1 tf = int(match_num.group(1)) if match_num else 1 print(tf) # 输出结果5
- 该方案对
15T(15分钟)、2H(2小时)、3D(3天)等所有带数字前缀的频率字符串都能正常提取 - 对
S、T、H、D这类不带数字的默认单位频率,会自动返回间隔值1,不会触发报错
内容的提问来源于stack exchange,提问作者Mainland
相关产品推荐
相关产品推荐

