如何将公交车进/出站记录汇总到行程中以提供唯一ID,并删除时间差小的重复记录?
Posted
技术标签:
【中文标题】如何将公交车进/出站记录汇总到行程中以提供唯一ID,并删除时间差小的重复记录?【英文标题】:How to gather buses enter/exit stations records into trips to give unique ID, and drop duplicate record with small difference in time? 【发布时间】:2021-05-06 04:35:30 【问题描述】:我每天有一条公交线路的数据集,有 32 辆公共汽车和两辆 route_direction(0,1)
,在第一个方向有 18 个车站,每个车站的 seq 从 1 到 18,另一个方向有 15 个车站,seq(1- 15) 并记录进出各站的时间。
每条记录包含 bus_id、route_direction、station_seq、in_time、out_time、station_id。
enter image description here
route_id route_direction bus_id station_seq schdeule_date in_time out_time
0 59 1 1349508393 2 2021-01-01 05:04:31 05:04:58
1 59 1 1349508393 2 2021-01-01 05:04:27 05:04:58
2 59 1 1349508393 2 2021-01-01 05:04:31 05:06:31
3 59 1 1349508393 2 2021-01-01 05:04:27 05:06:31
4 59 1 1349508393 1 2021-01-01 05:00:35 05:00:56
首先,我尝试对某个列进行分组,以便为每次旅行提供索引:
grouped = df.groupby(['bus_id', 'route_direction'])
我在这张图片中得到了类似的东西enter image description here:
index route_id route_direction bus_id station_seq schdeule_date in_time out_time
654 59 0 1349508329 1 2021-01-01 NaN 06:34:10
663 59 0 1349508329 2 2021-01-01 06:33:34 06:34:04
664 59 0 1349508329 2 2021-01-01 06:33:33 06:34:04
677 59 0 1349508329 2 2021-01-01 06:33:34 06:35:34
678 59 0 1349508329 2 2021-01-01 06:33:33 06:35:34
... ... ... ... ... ... ... ...
12133 59 0 1349508329 12 2021-01-01 NaN NaN
如您所见,在几乎相同的日期和时间,相同的 bus_id 相同的车站进入出口也有重复: 我尝试过删除重复项,但运气不好:
df = df.drop_duplicates(subset=['bus_id', 'route_direction', 'station_seq', 'station_id', 'in_time'], keep='first').reset_index(drop=True)
in_time 或 out_time 中也有一些 NaN 值,所以如果我 dropna,那么我可能会错过公交线路沿线其中一个车站的记录。
在一次旅行中对每条巴士记录进行分组以赋予其 ID 有什么帮助,在这种情况下如何删除重复的记录(进入时间略有不同)? 任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:-
带有“bus_id”和“in_time”的sort_values
groupby 'bus_id',对于每个 bus_id,计算每条记录的时间差异与它的前一条记录
如果时差小于60s,则标记为0,否则标记为1,以便设置某些组忽略时差
在标签上使用
cumsum
,创建组标签
groupby grouptag,对于每个 grouptag 保持 min(in_time) 和 max(out_time)
# convert the in_time to dateTime first, then sorted the values
df['in_time_t'] = pd.to_datetime(df['schdeule_date'] + ' ' + df['in_time'])
df.sort_values(['bus_id', 'in_time_t'], inplace=True)
# calculate the time difference for every bus_id
df['t_diff'] = df.groupby('bus_id')['in_time_t'].diff()
# set group_tag
cond = df['t_diff'].dt.seconds < 60
df['tag'] = np.where(cond, 0, 1).cumsum()
# for every grouptag keep min(in_time) and max(out_time)
df_result = df.groupby(['route_id', 'route_direction', 'bus_id', 'station_seq', 'schdeule_date',
'tag']).agg('in_time':'min', 'out_time':'max').reset_index()
df
route_id route_direction bus_id station_seq schdeule_date in_time out_time
0 59 1 1349508393 2 2021-01-01 05:04:31 05:04:58
1 59 1 1349508393 2 2021-01-01 05:04:27 05:04:58
2 59 1 1349508393 2 2021-01-01 05:04:31 05:06:31
3 59 1 1349508393 2 2021-01-01 05:04:27 05:06:31
4 59 1 1349508393 1 2021-01-01 05:00:35 05:00:56
654 59 0 1349508329 1 2021-01-01 NaN 06:34:10
663 59 0 1349508329 2 2021-01-01 06:33:34 06:34:04
664 59 0 1349508329 2 2021-01-01 06:33:33 06:34:04
677 59 0 1349508329 2 2021-01-01 06:33:34 06:35:34
678 59 0 1349508329 2 2021-01-01 06:33:33 06:35:34
12133 59 0 1349508329 12 2021-01-01 NaN NaN
df_result
route_id route_direction bus_id station_seq schdeule_date tag in_time out_time
0 59 0 1349508329 1 2021-01-01 2 NaN 06:34:10
1 59 0 1349508329 2 2021-01-01 1 06:33:33 06:35:34
2 59 0 1349508329 12 2021-01-01 3 NaN NaN
3 59 1 1349508393 1 2021-01-01 4 05:00:35 05:00:56
4 59 1 1349508393 2 2021-01-01 5 05:04:27 05:06:31
df with tag
| | route_id | route_direction | bus_id | station_seq | schdeule_date | in_time | out_time | in_time_t | t_diff | tag |
|------:|-----------:|------------------:|-----------:|--------------:|:----------------|:----------|:-----------|:--------------------|:----------------|------:|
| 664 | 59 | 0 | 1349508329 | 2 | 2021-01-01 | 06:33:33 | 06:34:04 | 2021-01-01 06:33:33 | NaT | 1 |
| 678 | 59 | 0 | 1349508329 | 2 | 2021-01-01 | 06:33:33 | 06:35:34 | 2021-01-01 06:33:33 | 0 days 00:00:00 | 1 |
| 663 | 59 | 0 | 1349508329 | 2 | 2021-01-01 | 06:33:34 | 06:34:04 | 2021-01-01 06:33:34 | 0 days 00:00:01 | 1 |
| 677 | 59 | 0 | 1349508329 | 2 | 2021-01-01 | 06:33:34 | 06:35:34 | 2021-01-01 06:33:34 | 0 days 00:00:00 | 1 |
| 654 | 59 | 0 | 1349508329 | 1 | 2021-01-01 | nan | 06:34:10 | NaT | NaT | 2 |
| 12133 | 59 | 0 | 1349508329 | 12 | 2021-01-01 | nan | nan | NaT | NaT | 3 |
| 4 | 59 | 1 | 1349508393 | 1 | 2021-01-01 | 05:00:35 | 05:00:56 | 2021-01-01 05:00:35 | NaT | 4 |
| 1 | 59 | 1 | 1349508393 | 2 | 2021-01-01 | 05:04:27 | 05:04:58 | 2021-01-01 05:04:27 | 0 days 00:03:52 | 5 |
| 3 | 59 | 1 | 1349508393 | 2 | 2021-01-01 | 05:04:27 | 05:06:31 | 2021-01-01 05:04:27 | 0 days 00:00:00 | 5 |
| 0 | 59 | 1 | 1349508393 | 2 | 2021-01-01 | 05:04:31 | 05:04:58 | 2021-01-01 05:04:31 | 0 days 00:00:04 | 5 |
| 2 | 59 | 1 | 1349508393 | 2 | 2021-01-01 | 05:04:31 | 05:06:31 | 2021-01-01 05:04:31 | 0 days 00:00:00 | 5 |
【讨论】:
感谢您的帮助。我确实应用了您建议的解决方案,但这还不够,因为在某些情况下,公共汽车进入下一站的时间小于退出当前站的时间。顺便说一句,我对 NaN 值也有很大的问题,以防万一我放弃了那些行,我可能会错过旅途中许多车站的记录,以及处理这些 NaN 值的任何建议。非常感谢您的帮助。 也许你可以提供更多的样本数据来涵盖所有的情况! 如何向您发送数据样本? 你可以用更多数据更新你的问题,或者使用谷歌驱动分享。 这里是数据样本drive.google.com/file/d/1nxTL6lmXwe5cVVCCgWZ-89jJAEuAmol-/…以上是关于如何将公交车进/出站记录汇总到行程中以提供唯一ID,并删除时间差小的重复记录?的主要内容,如果未能解决你的问题,请参考以下文章
在c#中以编程方式查询网卡的入站/出站IPv4数据包计数统计