【发布时间】:2021-07-06 17:56:40
【问题描述】:
我正在寻找一种更快/更聪明的方法来做我目前正在做的事情。
我有一个 pandas 数据框,其中包含两列感兴趣的“日期时间”和“值”。我想找到 Value 超过某个阈值但有 30 分钟窗口的所有行。 30 分钟窗口从第一次值 > 阈值开始(在一个分组中)。
假设阈值 = 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]
【问题讨论】:
标签: python pandas dataframe datetime