假设有以下数据库:
import pandas as pd
from time import strptime
data = {'num': ['B', 'A', 'B', 'A', 'B', 'A', 'B', 'C', 'B', 'A', 'C', 'B'],
'dir': ['IN', 'IN', 'PASS', 'PASS', 'PASS', 'PASS', 'OUT', 'IN', 'IN', 'OUT', 'OUT', 'OUT'],
'empty': [True, False, True, False, True, False, True, False, False, False, False, False],
'station': [100, 1, 20, 20, 14, 14, 5, 65, 89, 8, 66, 11],
'time': [strptime('20180115 00:25', '%Y%m%d %H:%M'),
strptime('20180115 00:30', '%Y%m%d %H:%M'),
strptime('20180115 01:10', '%Y%m%d %H:%M'),
strptime('20180115 01:10', '%Y%m%d %H:%M'),
strptime('20180115 02:10', '%Y%m%d %H:%M'),
strptime('20180115 02:10', '%Y%m%d %H:%M'),
strptime('20180115 03:33', '%Y%m%d %H:%M'),
strptime('20180115 03:33', '%Y%m%d %H:%M'),
strptime('20180115 03:34', '%Y%m%d %H:%M'),
strptime('20180115 04:10', '%Y%m%d %H:%M'),
strptime('20180115 04:11', '%Y%m%d %H:%M'),
strptime('20180115 10:10', '%Y%m%d %H:%M')]}
df = pd.DataFrame.from_dict(data)
我需要生成以下预期结果的列表:
num empty station_from station_to time_from time_to
0 B True 100 5 20180115 00:25 20180115 03:33
1 A False 1 8 20180115 00:30 20180115 04:10
2 C False 65 66 20180115 03:33 20180115 04:11
3 B False 89 11 20180115 03:34 20180115 10:10
解释: 这些是铁路车辆,每个车辆都有一个编号(例如A、B、C)。 它们可以是已经充电或未充电的状态(空列为未充电)。 dir列指示我们是否在该特定车辆中加入或卸下。还可以存在许多其他状态(如此示例中的PASS),但我们只对IN和OUT状态感兴趣。 station列是事件发生的位置, time列是事件发生的时间。
我需要将每个IN和OUT配对之间的数据分组(或显示每个IN和OUT的轨迹),并显示活动发生的位置和时间。难点在于这不是“常规”的分组方式,而是一种基于层次化的时间序列方法(在同一天内,一辆车可以被多次装载和卸载)。
我不知道pandas是否是实现这种操作的最佳结构,但在DB中有数亿条记录,因此性能至关重要。(我们根据特定时间段预选择数据)
如何实现所需结果?