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

如何推断非连续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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:45:54