【发布时间】:2021-11-06 11:27:32
【问题描述】:
我有以下数据集:
date event next_event duration_Minutes
2021-09-09 22:30:00 1 2021-09-09 23:00:00 30
2021-09-09 23:00:00 2 2021-09-09 23:10:00 10
2021-09-09 23:10:00 1 2021-09-09 23:50:00 40
2021-09-09 23:50:00 4 2021-09-10 00:50:00 60
2021-09-10 00:50:00 4 2021-09-12 00:50:00 2880
主要问题是我想通过以下方式将多日活动拆分为单独的活动。我想将事件持续时间从2021-09-09 23:50:00 到2021-09-10 00: 00: 00,然后将持续时间从2021-09-10 00: 00: 00 到2021-09-10 00:50:00,依此类推。这将很有用,因为之后,我需要按天对事件进行分组并按天计算每个事件的持续时间,所以我想修复这些事件之间存在日期变化的情况。
我想得到这样的东西:
date event next_event duration_Minutes
2021-09-09 22:30:00 1 2021-09-09 23:00:00 30
2021-09-09 23:00:00 2 2021-09-09 23:10:00 10
2021-09-09 23:10:00 1 2021-09-09 23:50:00 40
2021-09-09 23:50:00 4 2021-09-10 00:00:00 10
2021-09-09 00:00:00 4 2021-09-10 00:50:00 50
2021-09-10 00:50:00 4 2021-09-11 00:00:00 1390
2021-09-11 00:00:00 4 2021-09-12 00:00:00 1440
2021-09-12 00:00:00 4 2021-09-12 00:50:00 50
它应该能够处理我们在示例中一整天或更长时间没有活动的情况。
我目前的解决方案是:
first_record_hour_ts = df.index.floor('H')[0]
last_record_hour_ts = df.index.floor('H')[-1]
# Create a series from the first to the last date containing Nan
df_to_join = pd.Series(np.nan, index=pd.date_range(first_record_hour_ts, last_record_hour_ts, freq='H'))
df_to_join = pd.DataFrame(df_to_join)
# Concatenate with current status dataframe
df = pd.concat([df, df_to_join[~df_to_join.index.isin(df.index)]]).sort_index()
# Forward fill the nana
df.fillna(method='ffill', inplace=True)
df['next_event'] = df.index.shift(-1)
# Calculate the delta between the 2 status
df['duration'] = df['next_event'] - df.index
# Convert into minutes
df['duration_Minutes'] = df['duration_Minutes'].apply(lambda x: x.total_seconds() // 60)
这并不能完全解决问题,但我认为它可以解决我的目标,即最终能够按事件和按天分组。
【问题讨论】:
-
到目前为止你写了什么代码?
-
所以现在我的解决方案如下:我只取日期和事件列。我按小时在数据范围内创建了一个熊猫系列。我加入以便我拥有每天所有可能的时间以及以前的时间戳。然后我用前一个值向前填充事件列中的“NaN”值。然后我计算下一个事件和持续时间。通过这种方式,我认为我能够解决多天事件的问题,即使我有更多的行,因为最终我的目标是按天对数据进行分组,所以我认为它应该像这样工作。
-
我认为如果我们能看到您的实际代码会很有用——您可以编辑您的问题以将其添加到那里。大声思考,我想我想将 date-next_event 间隔跨越或不跨越午夜的情况分开。那些跨越午夜的必须分开处理,因为它们是分开的,可能会跨越数天。
-
好的,我添加了我现在写的代码
-
谢谢!我正在研究解决方案,我会告诉你进展如何
标签: python pandas datetime pandas-groupby