如何推断非连续Pandas TimeStamp序列的日/周/月度频率?
嘿,这个问题挺常见的——当日期序列存在缺失时,Pandas自带的freq属性确实会返回None,不过我们可以通过分析相邻日期的间隔模式,来推断它原本的频率。下面是具体的实操方法:
推断非连续日期序列的频率
核心思路是:计算相邻日期的时间差,统计这些差值的分布特征,再结合日度、周度、月度的间隔规律来判断。
步骤1:计算相邻日期的间隔
首先确保时间序列是有序的(保险起见,哪怕你的序列已经排好序),然后用diff()方法计算相邻元素的时间差:
import pandas as pd # 你的时间序列 times = pd.to_datetime(["2018-03-01", "2018-03-02", "2018-03-03", "2018-03-06", "2018-03-07", "2018-03-08", "2018-03-09", "2018-03-10", "2018-03-13", "2018-03-14", "2018-07-19", "2018-07-20", "2018-07-21", "2018-07-24", "2018-07-25", "2018-07-26", "2018-07-27", "2018-07-28", "2018-07-31", "2018-08-01"]) # 排序并计算间隔 times_sorted = times.sort_values() diffs = times_sorted.diff().dropna()
步骤2:分析间隔的分布规律
把时间差转换成天数,统计不同天数的出现次数,就能看出主导间隔:
# 转换为天为单位 diff_days = diffs.dt.days # 统计各间隔的出现次数 diff_counts = diff_days.value_counts() print(diff_counts)
运行后你会得到类似这样的输出:
1 14 3 4 131 1 Name: days, dtype: int64
从结果能明显看出:1天的间隔占了绝大多数,3天的间隔是因为跳过了周末(比如3月3日到6日是周六到周二),131天是季度空档。这直接说明原序列的频率是日度。
针对周度/月度的判断逻辑
- 如果是周度序列:你会看到7天的间隔占比最高,偶尔会出现14天(跳过一周)这类情况
- 如果是月度序列:间隔会集中在28-31天区间(因为不同月份天数有差异),比如28、30、31天的间隔总和占比最高
进阶:封装成自动推断函数
你可以把上述逻辑做成复用函数,根据间隔占比自动判断:
def infer_date_frequency(date_series): date_series = date_series.sort_values() diffs = date_series.diff().dropna().dt.days diff_counts = diffs.value_counts(normalize=True) # 用占比更直观 # 日度判断:1天间隔占比超过70%(可根据数据调整阈值) if diff_counts.get(1, 0) > 0.7: return "日度(daily)" # 周度判断:7天间隔占比超过70% elif diff_counts.get(7, 0) > 0.7: return "周度(weekly)" # 月度判断:28-31天间隔总占比超过70% elif diff_counts[diff_counts.index.isin(range(28, 32))].sum() > 0.7: return "月度(monthly)" else: return "无法明确推断(混合频率或缺失过多)" # 测试你的序列 print(infer_date_frequency(times)) # 输出:日度(daily)
内容的提问来源于stack exchange,提问作者Diogo Andrade
相关产品推荐
相关产品推荐

