Pandas groupby 使用选择行中的时间窗口
Posted
技术标签:
【中文标题】Pandas groupby 使用选择行中的时间窗口【英文标题】:Pandas groupby using time window from select rows 【发布时间】:2020-08-13 10:46:11 【问题描述】:我有一些时间序列数据,其中类型为“RX”或“CRC”的行的 ID 不幸地环绕 - 在此示例中为简单起见,它在达到“1”后环绕。这意味着当它们应该匹配从 0 到 4 的“TX”类型时,我最终会得到多个 0 和 1 id。“TX”总是正确的。
我想要做的是从每个 TX 行按 10ms 时间窗口分组,并根据 TX 行中的 id 值修复 id 列。即……
发件人:
time type id
0 2020-01-01 10:33:00.000 TX 0
1 2020-01-01 10:34:00.500 TX 1
2 2020-01-01 10:34:00.000 TX 2
3 2020-01-01 10:34:00.007 CRC 2
4 2020-01-01 10:34:00.009 RX 2
5 2020-01-01 10:34:00.027 RX 2
6 2020-01-01 10:34:00.047 RX 2
7 2020-01-01 10:34:00.012 TX 3
8 2020-01-01 10:34:00.013 RX 3
9 2020-01-01 10:34:00.038 RX 3
10 2020-01-01 10:34:00.026 TX 4
11 2020-01-01 10:34:00.036 TX 5
12 2020-01-01 10:34:00.041 TX 6
收件人:
time type id
0 2020-01-01 10:33:00.000 TX 0
1 2020-01-01 10:34:00.500 TX 1
2 2020-01-01 10:34:00.000 TX 2
3 2020-01-01 10:34:00.007 CRC 2
4 2020-01-01 10:34:00.009 RX 2
5 2020-01-01 10:34:00.012 TX 3
6 2020-01-01 10:34:00.013 RX 3
7 2020-01-01 10:34:00.026 TX 4
8 2020-01-01 10:34:00.027 RX 4
9 2020-01-01 10:34:00.036 TX 5
10 2020-01-01 10:34:00.038 RX 5
11 2020-01-01 10:34:00.041 TX 6
12 2020-01-01 10:34:00.047 RX 6
MWE:
s1 = pd.to_datetime(['20200101 10:33:00.000',
'20200101 10:34:00.500',
'20200101 10:34:00.000', '20200101 10:34:00.007', '20200101 10:34:00.009', '20200101 10:34:00.027', '20200101 10:34:00.047',
'20200101 10:34:00.012', '20200101 10:34:00.013', '20200101 10:34:00.038',
'20200101 10:34:00.026',
'20200101 10:34:00.036',
'20200101 10:34:00.041'])
d1 = 'time': s1,
'type': ['TX', 'TX', 'TX', 'CRC', 'RX', 'RX', 'RX', 'TX', 'RX', 'RX', 'TX', 'TX', 'TX'],
'id': [0, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 5, 6]
df1 = pd.DataFrame(data=d1)
print(df1)
s2 = pd.to_datetime(['20200101 10:33:00.000',
'20200101 10:34:00.500',
'20200101 10:34:00.000', '20200101 10:34:00.007', '20200101 10:34:00.009',
'20200101 10:34:00.012', '20200101 10:34:00.013',
'20200101 10:34:00.026', '20200101 10:34:00.027',
'20200101 10:34:00.036', '20200101 10:34:00.038',
'20200101 10:34:00.041', '20200101 10:34:00.047'])
d2 = 'time': s2,
'type': ['TX', 'TX', 'TX', 'CRC', 'RX', 'TX', 'RX', 'TX', 'RX', 'TX', 'RX', 'TX', 'RX'],
'id': [0, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6]
df2 = pd.DataFrame(data=d2)
print(df2)
【问题讨论】:
【参考方案1】:这看起来可以解决你的问题:
df1 = df1.sort_values('time')
df1['id'] = (df1['type'] == 'TX').cumsum() - 1
输出:
time type id
0 2020-01-01 10:34:00.000 TX 0
1 2020-01-01 10:34:00.007 CRC 0
2 2020-01-01 10:34:00.009 RX 0
5 2020-01-01 10:34:00.012 TX 1
6 2020-01-01 10:34:00.013 RX 1
8 2020-01-01 10:34:00.026 TX 2
3 2020-01-01 10:34:00.027 RX 2
9 2020-01-01 10:34:00.036 TX 3
7 2020-01-01 10:34:00.038 RX 3
10 2020-01-01 10:34:00.041 TX 4
4 2020-01-01 10:34:00.047 RX 4
【讨论】:
以上是关于Pandas groupby 使用选择行中的时间窗口的主要内容,如果未能解决你的问题,请参考以下文章