我的数据框有两列:TimeStamp和Value(十进制)。 我想在数据框中添加3个新列: oneMinuteValue 五分钟值 fifteenMinuteValue
数据按时间戳的升序排列。从第一个时间戳开始,我要经历从第一个时间戳到最后一个时间戳的每一分钟,并执行以下操作:
对于从这一分钟开始具有数据的每一行,将oneMinuteValue设置为以下任一值: a)前一分钟的最终值;要么 b)如果此时间戳恰好位于秒到秒的那一刻,则为当前值
对于5分钟和15分钟的专栏文章,我也希望这样做,但是我认为仅5分钟的示例就足够了
一个例子(十五分钟后):
TimeStamp Value OneMinuteValue FiveMinuteValue
2018-08-11 14:30:01 5 5 5
2018-08-11 14:30:11 4.8 5 5
2018-08-11 14:30:30 4.9 5 5
2018-08-11 14:30:46 5 5 5
2018-08-11 14:30:59 5.1 5 5
2018-08-11 14:31:01 5.2 5.1 5
2018-08-11 14:31:20 5.3 5.1 5
2018-08-11 14:31:40 5.4 5.1 5
2018-08-11 14:32:16 5.5 5.4 5
2018-08-11 14:32:28 5.6 5.4 5
2018-08-11 14:33:04 5.6 5.6 5
2018-08-11 14:33:40 5.7 5.6 5
2018-08-11 14:34:01 5.7 5.7 5
2018-08-11 14:34:22 5.8 5.7 5
2018-08-11 14:34:32 5.8 5.7 5
2018-08-11 14:34:48 5.9 5.7 5
2018-08-11 14:34:59 6.0 5.7 5
2018-08-11 14:35:01 6.1 6.0 6
2018-08-11 14:35:21 6.2 6.0 6
答案 0 :(得分:1)
首先在floor
的预期时间之前用duplicated
创建布尔掩码,以仅保留最后一个值。然后使用mask
为所有值创建NaN
且不设最后一个。这些值被shift
ed且NaN
被前向填充替换。最后用Value
列的第一个值替换第一组:
first = df.iloc[0, df.columns.get_loc('Value')]
m1 = df['TimeStamp'].dt.floor('1Min').duplicated(keep='last')
df['1min'] = df['Value'].mask(m1).shift().ffill().fillna(first)
m2 = df['TimeStamp'].dt.floor('5Min').duplicated(keep='last')
df['5min'] = df['Value'].mask(m2).shift().ffill().fillna(first)
print (df)
TimeStamp Value OneMinuteValue FiveMinuteValue 1min 5min
0 2018-08-11 14:30:01 5.0 5.0 5 5.0 5.0
1 2018-08-11 14:30:11 4.8 5.0 5 5.0 5.0
2 2018-08-11 14:30:30 4.9 5.0 5 5.0 5.0
3 2018-08-11 14:30:46 5.0 5.0 5 5.0 5.0
4 2018-08-11 14:30:59 5.1 5.0 5 5.0 5.0
5 2018-08-11 14:31:01 5.2 5.1 5 5.1 5.0
6 2018-08-11 14:31:20 5.3 5.1 5 5.1 5.0
7 2018-08-11 14:31:40 5.4 5.1 5 5.1 5.0
8 2018-08-11 14:32:16 5.5 5.4 5 5.4 5.0
9 2018-08-11 14:32:28 5.6 5.4 5 5.4 5.0
10 2018-08-11 14:33:04 5.6 5.6 5 5.6 5.0
11 2018-08-11 14:33:40 5.7 5.6 5 5.6 5.0
12 2018-08-11 14:34:01 5.7 5.7 5 5.7 5.0
13 2018-08-11 14:34:22 5.8 5.7 5 5.7 5.0
14 2018-08-11 14:34:32 5.8 5.7 5 5.7 5.0
15 2018-08-11 14:34:48 5.9 5.7 5 5.7 5.0
16 2018-08-11 14:34:59 6.0 5.7 5 5.7 5.0
17 2018-08-11 14:35:01 6.1 6.0 6 6.0 6.0
18 2018-08-11 14:35:01 6.2 6.0 5 6.0 6.0
另一个带有循环的解决方案:
cols = ['1Min','5Min']
first = df.iloc[0, df.columns.get_loc('Value')]
for x in cols:
m = df['TimeStamp'].dt.floor(x).duplicated(keep='last')
df[x] = df['Value'].mask(m).shift().ffill().fillna(first)
print (df)
TimeStamp Value OneMinuteValue FiveMinuteValue 1Min 5Min
0 2018-08-11 14:30:01 5.0 5.0 5 5.0 5.0
1 2018-08-11 14:30:11 4.8 5.0 5 5.0 5.0
2 2018-08-11 14:30:30 4.9 5.0 5 5.0 5.0
3 2018-08-11 14:30:46 5.0 5.0 5 5.0 5.0
4 2018-08-11 14:30:59 5.1 5.0 5 5.0 5.0
5 2018-08-11 14:31:01 5.2 5.1 5 5.1 5.0
6 2018-08-11 14:31:20 5.3 5.1 5 5.1 5.0
7 2018-08-11 14:31:40 5.4 5.1 5 5.1 5.0
8 2018-08-11 14:32:16 5.5 5.4 5 5.4 5.0
9 2018-08-11 14:32:28 5.6 5.4 5 5.4 5.0
10 2018-08-11 14:33:04 5.6 5.6 5 5.6 5.0
11 2018-08-11 14:33:40 5.7 5.6 5 5.6 5.0
12 2018-08-11 14:34:01 5.7 5.7 5 5.7 5.0
13 2018-08-11 14:34:22 5.8 5.7 5 5.7 5.0
14 2018-08-11 14:34:32 5.8 5.7 5 5.7 5.0
15 2018-08-11 14:34:48 5.9 5.7 5 5.7 5.0
16 2018-08-11 14:34:59 6.0 5.7 5 5.7 5.0
17 2018-08-11 14:35:01 6.1 6.0 6 6.0 6.0
18 2018-08-11 14:35:01 6.2 6.0 6 6.0 6.0