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 使用选择行中的时间窗口的主要内容,如果未能解决你的问题,请参考以下文章

使用 groupby 变换从特定行中减去值

python pandas:groupby中2个日期之间的差异

Pandas GroupBy 并选择特定列中具有最小值的行

从 pandas groupby 对象中选择多个组

如何使用 groupby 调整 pandas 中的小计列?

Python Pandas 从 Groupby 中选择随机组样本