我有一个包裹寄送数据表,如下图所示:
route_id parcel_id loading_time other_fields
X1 001 14:20 25/07/2019 ...
X2 025 14:23 25/07/2019 ...
... ... ...
我想计算每个route_id每10分钟(0-10、11-20、21-30)出现的所有包裹重量的平均值。所以我想要的结果表如下:
route_id time_window average_weight(kg)
X1 870 (i.e. 14:20 - 14:30,only show UpperBound) 550
X1 880 1020
... ... ...
如何在Pandas或SQL Server中轻松地做到这一点?
答案 0 :(得分:1)
如果我对您的理解正确,则您希望每隔10分钟通过route_id
执行一次汇总。您的loading_time
也是一个字符串。首先将其转换为Timestamp
。
由于没有示例输入数据,因此以下示例使用了一些模拟数据:
loading_times = np.random.choice(pd.date_range('2019-07-25 9:00', '2019-07-25 9:20', freq='T'), 10)
df = pd.DataFrame({
'route_id': np.random.randint(1, 4, len(loading_times)),
'weight': np.random.randint(1, 5, len(loading_times)),
'loading_time': loading_times
})
样本数据(已排序):
route_id weight loading_time
1 2 2019-07-25 09:00:00
1 1 2019-07-25 09:07:00
1 4 2019-07-25 09:10:00
1 1 2019-07-25 09:12:00
1 2 2019-07-25 09:13:00
1 2 2019-07-25 09:15:00
1 3 2019-07-25 09:19:00
2 4 2019-07-25 09:03:00
3 4 2019-07-25 09:04:00
3 3 2019-07-25 09:17:00
然后将其分组:
def summarize(x):
return pd.Series({
'count': len(x),
'avg_weight': x['weight'].mean()
})
by = ['route_id', pd.Grouper(key='loading_time', freq='10T')]
df.groupby(by).apply(summarize)
结果:
count avg_weight
route_id loading_time
1 2019-07-25 09:00:00 2.0 1.5
2019-07-25 09:10:00 5.0 2.4
2 2019-07-25 09:00:00 1.0 4.0
3 2019-07-25 09:00:00 1.0 4.0
2019-07-25 09:10:00 1.0 3.0