Pandas将时间间隔与时间序列重叠

2024-04-19 03:06:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pandas数据帧,其中包括在某些点重叠的时间间隔(图1)。我需要一个数据帧,它有一个从第一个开始时间到最后一个结束时间的时间序列(图2)。 我必须以重叠的时间间隔总结VIS值。 我想不出来。我怎么做

enter image description here

enter image description here


Tags: 数据pandas间隔时间序列vis
2条回答

这个问题可以通过python包staircase轻松解决,该包基于pandas和numpy构建,用于处理(数学)阶跃函数

假设您的原始数据帧名为df,并且您希望在结果数据帧中使用的时间是一个名为times的数组(或日期时间索引,或系列等)

import staircase as sc

stepfunction = sc.Stairs(df, start="start_time", end="end_time", value="VIS")
result = stepfunction(times, include_index=True)

就是这样,result是一个按时间索引的熊猫系列,具有您想要的值。可以使用序列上的reset_index方法将其转换为所需格式的数据帧

您可以像这样生成times数据

import pandas as pd

times = pd.date_range(df["start_time"].min(), df["end_time"].max(), freq="30min")

为什么它有效

数据帧中的每一行都可以看作一个步骤函数。例如,第一行对应于一个step函数,该函数以零开始,然后at2002-02-03 04:15:00增加到10,然后at2002-02-04 04:45:00返回到零。当对每行的所有阶跃函数求和时,有一个阶跃函数,其值是任意点上所有VIS值的总和。这是分配给上述stepfunction变量的内容。stepfunction变量是可调用的,并在指定的点返回step函数的值。这就是示例的最后一行所发生的情况,其中result变量被赋值

如果你粘贴你的数据而不是图片,我就可以测试这个了。但你可能想这样想。假设您的数据帧称为df

df['start_time'] = pd.to_datetime(df['start_time']) # in case it's not datetime already
df.set_index('start_time', inplace=True)
new_dates = pd.date_range(start=min(df.index), end=max(df.end_time), freq='15Min')
new_df = df.reindex(new_dates, fill_value=np.nan)

只要启动时间中没有重复项,就应该可以工作。如果有,那就需要以其他方式处理

重新取样是另一种可能性,但如果没有数据,很难说什么可行

相关问题 更多 >