熊猫将时间间隔重叠到时间序列
Posted
技术标签:
【中文标题】熊猫将时间间隔重叠到时间序列【英文标题】:Pandas overlapped time intervals to time series 【发布时间】:2021-12-01 06:55:56 【问题描述】:我有一个 pandas 数据框,其中包含在某些点重叠的时间间隔(图 1)。我需要一个具有从第一个 start_time 开始到最后一个 end_time 结束的时间序列的数据框(图 2)。 我必须以重叠的时间间隔总结 VIS 值。 我想不通。我该怎么做?
【问题讨论】:
交叉合并查询。 我找到了一些类似的主题,但有一些答案并没有奏效。 【参考方案1】:如果您粘贴数据而不是图像,我可以对此进行测试。但这就是您可能想要考虑的方式。假设您的数据框名为 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)
只要 start_time 中没有重复项,这应该可以。如果有,那就需要以其他方式处理。
重新采样是另一种可能性,但没有数据,很难说什么可行。
【讨论】:
【参考方案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")
为什么会起作用
数据框中的每一行都可以被认为是一个阶跃函数。例如,第一行对应于一个阶跃函数,它从零值开始,然后在2002-02-03 04:15:00
处增加到值 10,然后在2002-02-04 04:45:00
处返回零。当您将每一行的所有阶跃函数相加时,您就有一个阶跃函数,其值是任意点所有 VIS 值的总和。这就是上面分配给stepfunction
变量的内容。 stepfunction
变量是可调用的,并返回指定点处的阶跃函数值。这就是分配result
变量的示例的最后一行发生的情况。
【讨论】:
以上是关于熊猫将时间间隔重叠到时间序列的主要内容,如果未能解决你的问题,请参考以下文章