首页 > 解决方案 > 如何从缺少一些观察的索引中推断频率?

问题描述

使用pd.date_range likedr = pd.date_range('2020', freq='15min', periods=n_obs)将产生这个 DateTimeIndex 间隔或频率为 15 分钟:

DatetimeIndex(['2020-01-01 00:00:00', '2020-01-01 00:15:00',
           '2020-01-01 00:30:00', '2020-01-01 00:45:00',
           '2020-01-01 01:00:00'],
          dtype='datetime64[ns]', freq='15T')

您可以使用它来设置 pandas 数据框,例如:

import pandas as pd
import numpy as np

# data
np.random.seed(10)
n_obs = 10
daterange = pd.date_range('2020', freq='15min', periods=n_obs)
values = np.random.uniform(low=-1, high=1, size=n_obs).tolist()
df = pd.DataFrame({'time':daterange, 'value':values})
df = df.set_index('time')

现在您可以使用再次pd.infer_freq(df.index)检索频率'15T'以进行进一步计算。仔细观察help(pd.infer_freq())让我们知道pd.infer_freq将:

Infer the most likely frequency given the input index. If the frequency is
uncertain, a warning will be printed.

'15T'我对此的理解是,如果缺少一些观察结果,则可以进行检索,从而导致时间索引不规则。但是当我使用以下方法删除一些观察结果时:

dropped = df.index[[1,3]]
df =  df.drop(dropped)

然后pd.infer_freq(df.index)返回None。如果我们设置n_obs = 100. [...] infer the most likely frequency [...]因此,当我认为这意味着pd.infer_freq()可以推断这实际上是一个频率为 15 分钟且只有几个缺失值的索引时,我似乎希望有点过头了。有没有其他方法我可以使用 pandas 从有点不规则的时间序列中以编程方式推断索引频率?

标签: pythonpandas

解决方案


您可以计算索引中值的最小时间差(此处min_delta),尝试在索引中找到 3 个连续值,每个值之间都有这个最小时间差,然后调用infer_freq索引的这些连续值:

diffs = (df.index[1:] - df.index[:-1])
min_delta = diffs.min()
mask = (diffs == min_delta)[:-1] & (diffs[:-1] == diffs[1:])
pos = np.where(mask)[0][0]
print(pd.infer_freq(idx[pos: pos + 3]))

这将检索“15T”。


推荐阅读