我正在尝试对消息进行分组,这些消息是在短时间内发送的。一个参数定义了消息之间的最大持续时间,以便将它们视为块的一部分。如果将消息添加到块中,则时间窗口将延长,以便将更多消息视为块的一部分。
示例输入
| | 消息| message |
| --|--|--|
| 0 |2023-01-01 12:00:00|一|
| 1 |2023-01-01 12:20:00| B|
| 2 |2023-01-01 12:30:00| C|
| 3 |2023-01-01 12:30:55| D|
| 4 |2023-01-01 12:31:20| E|
| 5 |2023-01-01 15:00:00| F|
| 6 |2023-01-01 15:30:30| G|
| 7 |2023-01-01 15:30:55| H|
参数设置为1 min时的预期输出
| | 消息|datetime_last| n块| n_block |
| --|--|--|--|--|
| 0 |2023-01-01 12:00:00|一|2023-01-01 12:00:00| 1 |
| 1 |2023-01-01 12:20:00| B| 2023-01-01 12:20:00| 1 |
| 2 |2023-01-01 12:30:00| C\n D\n E| 2023-01-01 12:31:20| 3 |
| 3 |2023-01-01 15:00:00| F| 2023-01-01 15:00:00| 1 |
| 4 |2023-01-01 15:30:30|公司简介|2023-01-01 15:30:55| 2 |
我失败的尝试
我希望通过滚动窗口来实现这一点,滚动窗口将不断追加消息行。
def join_messages(x):
return '\n'.join(x)
df.rolling(window='1min', on='datetime').agg({
'datetime': ['first', 'last'],
'message': [join_messages, "count"]}) #Somehow overwrite datetime with the aggregated datetime.first.
字符串
两个聚合都在ValueError:invalid on specified as datetime, must be a column (of DataFrame), an Index or None
上失败。
我没有看到一个干净的方法来让datetime
在Window中“可访问”。此外,滚动也不能很好地处理字符串。我的印象是,这是一个死胡同,有一个更干净的方法来解决这个问题。
输入和预期数据的片段
df = pd.DataFrame({
'datetime': [pd.Timestamp('2023-01-01 12:00'),
pd.Timestamp('2023-01-01 12:20'),
pd.Timestamp('2023-01-01 12:30:00'),
pd.Timestamp('2023-01-01 12:30:55'),
pd.Timestamp('2023-01-01 12:31:20'),
pd.Timestamp('2023-01-01 15:00'),
pd.Timestamp('2023-01-01 15:30:30'),
pd.Timestamp('2023-01-01 15:30:55'),],
'message': list('ABCDEFGH')})
df_expected = pd.DataFrame({
'datetime': [pd.Timestamp('2023-01-01 12:00'),
pd.Timestamp('2023-01-01 12:20'),
pd.Timestamp('2023-01-01 12:30:00'),
pd.Timestamp('2023-01-01 15:00'),
pd.Timestamp('2023-01-01 15:30:30'),],
'message': ['A', 'B', 'C\nD\nE', 'F', 'G\nH'],
'datetime_last': [pd.Timestamp('2023-01-01 12:00'),
pd.Timestamp('2023-01-01 12:20'),
pd.Timestamp('2023-01-01 12:31:20'),
pd.Timestamp('2023-01-01 15:00'),
pd.Timestamp('2023-01-01 15:30:55'),],
'n_block': [1, 1, 3, 1, 2]})
型
1条答案
按热度按时间6l7fqoea1#
比较当前和以前的日期时间值,以标记差异大于1 min的行,然后在标记上应用累积和,以区分不同的日期时间块。现在,按这些块对字符串进行分组并聚合以获得结果
个字符