仅按过去重新采样 5 分钟
resample 5 minutes only by past
问题
如何创建在 pandas 中重新采样 5 分钟但仅到当前特定行的列,因此要么从当前观察开始持续 5 分钟,要么间隔 5 分钟但如果我在第 3 分钟重新采样最后 5或最后 3 个,要点是不要在未来重新采样。
DataFrame 按日期时间排序
例如第一行可以忽略,因为还没有累积 5 分钟:
期望的输出
datetime result mean
3/1/2022 0:04 1
3/1/2022 0:05 0
3/1/2022 0:06 0
3/1/2022 0:06 1
3/1/2022 0:07 1
3/1/2022 0:08 1
3/1/2022 0:10 1 0.666666667
3/1/2022 0:11 1 0.833333333
3/1/2022 0:12 0 0.8
3/1/2022 0:13 0 0.666666667
3/1/2022 0:14 0 0.4
3/1/2022 0:17 0 0
3/1/2022 0:18 1 0.25
3/1/2022 0:19 1 0.5
3/1/2022 0:20 1 0.75
3/1/2022 0:21 1 0.8
3/1/2022 0:22 1 0.833333333
3/1/2022 0:23 1 1
您需要在两个边界上使用闭区间 rolling
。
# ensure datetime type
df['datetime'] = pd.to_datetime(df['datetime'])
# compute the rolling mean
df['resample'] = df.rolling('5min', closed='both', on='datetime')['result'].mean()
如果在间隔小于 5 分钟时需要 NaN,可以屏蔽这些值:
df['resample2'] = (df.rolling('5min', closed='both', on='datetime')['result'].mean()
.where(df['datetime'].sub(df['datetime'].iloc[0]).gt('5min'))
)
输出:
datetime result resample resample2
0 2022-03-01 00:04:00 1 1.000000 NaN
1 2022-03-01 00:05:00 0 0.500000 NaN
2 2022-03-01 00:06:00 0 0.333333 NaN
3 2022-03-01 00:06:00 1 0.500000 NaN
4 2022-03-01 00:07:00 1 0.600000 NaN
5 2022-03-01 00:08:00 1 0.666667 NaN
6 2022-03-01 00:10:00 1 0.666667 0.666667
7 2022-03-01 00:11:00 1 0.833333 0.833333
8 2022-03-01 00:12:00 0 0.800000 0.800000
9 2022-03-01 00:13:00 0 0.600000 0.600000
10 2022-03-01 00:14:00 0 0.400000 0.400000
11 2022-03-01 00:17:00 0 0.000000 0.000000
12 2022-03-01 00:18:00 1 0.250000 0.250000
13 2022-03-01 00:19:00 1 0.500000 0.500000
14 2022-03-01 00:20:00 1 0.750000 0.750000
15 2022-03-01 00:21:00 1 0.800000 0.800000
16 2022-03-01 00:22:00 1 0.833333 0.833333
17 2022-03-01 00:23:00 1 1.000000 1.000000
问题
如何创建在 pandas 中重新采样 5 分钟但仅到当前特定行的列,因此要么从当前观察开始持续 5 分钟,要么间隔 5 分钟但如果我在第 3 分钟重新采样最后 5或最后 3 个,要点是不要在未来重新采样。 DataFrame 按日期时间排序
例如第一行可以忽略,因为还没有累积 5 分钟:
期望的输出
datetime result mean
3/1/2022 0:04 1
3/1/2022 0:05 0
3/1/2022 0:06 0
3/1/2022 0:06 1
3/1/2022 0:07 1
3/1/2022 0:08 1
3/1/2022 0:10 1 0.666666667
3/1/2022 0:11 1 0.833333333
3/1/2022 0:12 0 0.8
3/1/2022 0:13 0 0.666666667
3/1/2022 0:14 0 0.4
3/1/2022 0:17 0 0
3/1/2022 0:18 1 0.25
3/1/2022 0:19 1 0.5
3/1/2022 0:20 1 0.75
3/1/2022 0:21 1 0.8
3/1/2022 0:22 1 0.833333333
3/1/2022 0:23 1 1
您需要在两个边界上使用闭区间 rolling
。
# ensure datetime type
df['datetime'] = pd.to_datetime(df['datetime'])
# compute the rolling mean
df['resample'] = df.rolling('5min', closed='both', on='datetime')['result'].mean()
如果在间隔小于 5 分钟时需要 NaN,可以屏蔽这些值:
df['resample2'] = (df.rolling('5min', closed='both', on='datetime')['result'].mean()
.where(df['datetime'].sub(df['datetime'].iloc[0]).gt('5min'))
)
输出:
datetime result resample resample2
0 2022-03-01 00:04:00 1 1.000000 NaN
1 2022-03-01 00:05:00 0 0.500000 NaN
2 2022-03-01 00:06:00 0 0.333333 NaN
3 2022-03-01 00:06:00 1 0.500000 NaN
4 2022-03-01 00:07:00 1 0.600000 NaN
5 2022-03-01 00:08:00 1 0.666667 NaN
6 2022-03-01 00:10:00 1 0.666667 0.666667
7 2022-03-01 00:11:00 1 0.833333 0.833333
8 2022-03-01 00:12:00 0 0.800000 0.800000
9 2022-03-01 00:13:00 0 0.600000 0.600000
10 2022-03-01 00:14:00 0 0.400000 0.400000
11 2022-03-01 00:17:00 0 0.000000 0.000000
12 2022-03-01 00:18:00 1 0.250000 0.250000
13 2022-03-01 00:19:00 1 0.500000 0.500000
14 2022-03-01 00:20:00 1 0.750000 0.750000
15 2022-03-01 00:21:00 1 0.800000 0.800000
16 2022-03-01 00:22:00 1 0.833333 0.833333
17 2022-03-01 00:23:00 1 1.000000 1.000000