【问题标题】:Pandas Automatic Identification of freq for pd.date_range from dataPandas 从数据中自动识别 pd.date_range 的频率
【发布时间】:2020-08-11 19:57:26
【问题描述】:

我正在尝试开发一个框架来处理时间序列数据。我在 pandas 数据框中读取了时间序列数据,其中包含一个时间列。时间频率可以是小时/天/季度/月等。 我目前正忙于为预测创建未来的时间值。

例如,如果该系列是月刊,我可以使用:

forecast_period = pd.date_range(start='1994-09-01', periods=12, freq='MS')

但我需要一种通用的方法,它能够自动找到时间序列的频率并生成未来值(类似于外推)。

【问题讨论】:

  • which is able to find the frequency of a time series automatically - 你能添加一些示例数据吗?通常不可能,但这取决于
  • 显而易见的事情是按增加的日期时间对数据进行排序,排除重复项,取每个样本之间的间隔,然后取其模式(排除异常值、间隙等)。但是您需要将一些示例数据发布到prevent this being closed as 'Too Broad'/'Needs Details'。或者,您的代码可以试探性地尝试拟合从(例如)1h 到 1d 到 1 个月到 3 个月到 12 个月的间隔,并返回可行的最低值。
  • 我也在想,简单的方式可能不太可能。可能我将不得不设计一个基于规则的启发式方法来返回给定一些初始数据点之间的时间差的采样频率。无论如何感谢您的 cmets :)

标签: python pandas datetime date-arithmetic


【解决方案1】:

我编写了一个函数来使用基于规则的方法查找频率。我想这在大多数情况下都有效。欢迎任何反馈。

def findSampleFreq(ts, nrows=10, time_col='TimeStamp'):
n = min(nrows, ts.shape[0])

t_diffs = []
for i in np.arange(n):
    td = ts.loc[i+1, time_col]-ts.loc[i, time_col]
    t_diffs.append(td)

avg_diff = np.mean(t_diffs)

diff_ns = avg_diff.value
diff_us = diff_ns / 1000
diff_ms = diff_us / 1000
diff_sec = diff_ms / 1000    
diff_min = diff_sec / 60
diff_hour = diff_min / 60
diff_day = avg_diff.days
diff_wk = diff_day / 7
diff_month = diff_day / 30.4375
diff_qtr = diff_day / 91.3125
diff_yr = diff_day / 365.25

#the unit having minimum absolute difference with 1
# is the sampling freq
diffs = [np.abs(1-diff_ns), np.abs(1-diff_us), np.abs(1-diff_ms),
         np.abs(1-diff_sec), np.abs(1-diff_min), np.abs(1-diff_hour),
         np.abs(1-diff_day), np.abs(1-diff_wk), np.abs(1-diff_month),
         np.abs(1-diff_qtr), np.abs(1-diff_yr)]

aliases = ['N', 'U', 'L', 'S', 'T', 'H', 'D', 'W', 'MS', 'Q', 'YS']    
id = diffs.index(min(diffs))
return aliases[id]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 2016-12-22
    • 1970-01-01
    相关资源
    最近更新 更多