如何从存在少量缺失观测值的索引中推断频率?

8
使用 pd.date_range 方法,输入 '2020' 并设置频率为 '15min',周期为 n_obs,将生成一个间隔为 15 分钟的 DateTimeIndex。
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 dataframe:
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也会出现这种情况。因此,当我认为[...] 推断最可能的频率 [...]意味着pd.infer_freq()仅通过少量缺失值就可以推断出该索引实际上具有15分钟的频率时,似乎我期望过高了。是否有其他方法可以使用pandas从略微不规则的时间序列中编程地推断出索引频率?

1个回答

4
您可以计算索引中数值的最小时间差(此处为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]
idx = df.index
print(pd.infer_freq(idx[pos: pos + 3]))

这将检索"15T"。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接