【发布时间】:2021-05-10 14:53:13
【问题描述】:
我有一个时间序列,中间有休息时间(没有录音的时间)。一个简化的例子是:
df = pd.DataFrame(
np.random.rand(13), columns=["values"],
index=pd.date_range(start='1/1/2020 11:00:00',end='1/1/2020 23:00:00',freq='H'))
df.iloc[4:7] = np.nan
df.dropna(inplace=True)
df
values
2020-01-01 11:00:00 0.100339
2020-01-01 12:00:00 0.054668
2020-01-01 13:00:00 0.209965
2020-01-01 14:00:00 0.551023
2020-01-01 18:00:00 0.495879
2020-01-01 19:00:00 0.479905
2020-01-01 20:00:00 0.250568
2020-01-01 21:00:00 0.904743
2020-01-01 22:00:00 0.686085
2020-01-01 23:00:00 0.188166
现在我想将其拆分为除以一定时间跨度(例如 2 小时)的间隔。在上面的示例中,这将是:
( values
2020-01-01 11:00:00 0.100339
2020-01-01 12:00:00 0.054668
2020-01-01 13:00:00 0.209965
2020-01-01 14:00:00 0.551023,
values
2020-01-01 18:00:00 0.495879
2020-01-01 19:00:00 0.479905
2020-01-01 20:00:00 0.250568
2020-01-01 21:00:00 0.904743
2020-01-01 22:00:00 0.686085
2020-01-01 23:00:00 0.188166)
我有点惊讶我没有找到任何东西,因为我认为这是一个常见问题。我目前获取每个间隔的开始和结束索引的解决方案是:
def intervals(data: pd.DataFrame, delta_t: timedelta = timedelta(hours=2)):
data = data.sort_values(by=['event_timestamp'], ignore_index=True)
breaks = (data['event_timestamp'].diff() > delta_t).astype(bool).values
ranges = []
start = 0
end = start
for i, e in enumerate(breaks):
if not e:
end = i
if i == len(breaks) - 1:
ranges.append((start, end))
start = i
end = start
elif i != 0:
ranges.append((start, end))
start = i
end = start
return ranges
有什么建议可以让我以更聪明的方式做到这一点吗?我怀疑这应该可以使用groupby 以某种方式实现。
【问题讨论】:
-
为什么您的示例中只有两个组?第二组跨越 5 小时。为什么
14:00:00消失了? -
哦,等等,我想我现在明白了:您想在超过某个阈值持续时间的地方进行拆分。不过,不确定
14:00发生了什么,可能是疏忽? -
哦,是的
14:00是个错误。
标签: python pandas dataframe time-series intervals