在pandas数据帧中查找间隔至少30分钟但不定期间隔30分钟的时间戳



我正在寻找一种更快/更聪明的方法来做我目前正在做的事情。

我有一个pandas数据帧,它有两个感兴趣的列,"DateTime"one_answers"Value"。我想查找Value超过某个阈值但具有30分钟窗口的所有行。30分钟窗口开始于第一次Value>阈值(在分组中(。

假设阈值=0.5,我们有以下几行。

DateTime,Value
2021-07-06 09:00:00,0.4
2021-07-06 09:01:00,0.51
2021-07-06 09:02:00,0.55
2021-07-06 09:03:00,0.56
2021-07-06 09:04:00,0.49
2021-07-06 09:05:00,0.51
2021-07-06 09:29:00,0.2
2021-07-06 09:30:00,0.6
2021-07-06 09:31:00,0.1
2021-07-06 09:45:00,0.7
2021-07-06 09:46:00,0.8

所以在这种情况下,要返回的第一行是9:01,下一行是9:45。

目前,我通过迭代找到这些行,而且效率非常低。有没有更好的方法可以更矢量化?我有数百个这样的文件,数百万行,许多阈值,需要几个小时才能完成。

import pandas as pd
row_indices = []
threshold_val = 0.5
wait_time = pd.Timedelta(30, unit='m')
df = pd.read_csv('sample_data.csv')
df['DateTime'] = pd.to_datetime(df['DateTime'], format='%Y-%m-%d %H:%M:%S')
rows = df[df['Value'] > threshold_val] 
while len(rows) > 0:
row_index = rows.first_valid_index()
row_time = rows['DateTime'][row_index]
row_indices.append(row_index)
rows = rows[rows['DateTime'] > row_time + wait_time]

结果:

df
Out[112]: 
DateTime  Value
0  2021-07-06 09:00:00   0.40
1  2021-07-06 09:01:00   0.51
2  2021-07-06 09:02:00   0.55
3  2021-07-06 09:03:00   0.56
4  2021-07-06 09:04:00   0.49
5  2021-07-06 09:05:00   0.51
6  2021-07-06 09:29:00   0.20
7  2021-07-06 09:30:00   0.60
8  2021-07-06 09:31:00   0.10
9  2021-07-06 09:45:00   0.70
10 2021-07-06 09:46:00   0.80
row_indices
Out[113]: [1, 9]

我希望我正确理解了你的问题:

df = df.loc[df.Value > 0.5]
df = df.reset_index()
df["DateTime2"] = df["DateTime"]
print(
df.groupby(pd.Grouper(freq="30min", key="DateTime", origin="start"))
.first()
.reset_index(drop=True)
)

打印:

index  Value           DateTime2
0      1   0.51 2021-07-06 09:01:00
1      9   0.70 2021-07-06 09:45:00

索引在index列中:19

让我们从查找所有高于阈值的值开始:

df2 = df[df.Value > 0.5]

然后,分组30min(+1s为独占(,并保持每组的第一个值:

df2['DateTime'] = pd.to_datetime(df2['DateTime']) ## make sure DateTime is DateTime type
d.reset_index().groupby(pd.Grouper(freq='30min1s', key='DateTime')).index.first().values

输出:

[1,9]

让我们知道它跑得有多快!

最新更新