python - 如何从缺少一些观察的索引中推断频率?
问题描述
使用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 从有点不规则的时间序列中以编程方式推断索引频率?
解决方案
您可以计算索引中值的最小时间差(此处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”。
推荐阅读
- swift - 如何进行正确的授权
- android - 我的导航抽屉中片段中的按钮不起作用。应用程序崩溃
- python - 为什么除法与乘法的时间相似?
- javascript - 将 php 数组中的注册错误显示为模态
- c - 为什么这个短程序会产生这个输出?
- facebook - 如何使用页面范围 id PSID 生成用于在 Facebook 页面中与用户聊天的 URL
- kernel - kaggle中的提交时间和运行代码的时间一样吗?
- svg - SVG 路径“填充”的颜色超出预期
- c - Makefile 无法构建内核模块“配方在第一个目标之前开始”
- c++ - Openssl RSA_new() 和内存泄漏检测