【问题标题】:Pandas - slice data and calculate averagesPandas - 切片数据并计算平均值
【发布时间】:2019-12-03 04:58:05
【问题描述】:

我有一个包裹递送数据表,结构如下:

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 中轻松做到这一点?

【问题讨论】:

标签: python sql sql-server pandas


【解决方案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

【讨论】:

  • 我已经编辑了我的问题。 1)。我想在定义的时间段内(每 10 分钟、0-10、11-20、21-30)获得包裹的平均值。最终结果中的 loading_time 是时间间隔的上限吗? 2)。如何复制索引中的route_id?
  • (1) 上面输出中的loading_time是周期的开始时间(即从9:00到9:10之前,从9:10到9:20之前,等等。 )。 (2) 仅用于展示。 route_id 在每一行都可用
  • 非常感谢。我需要删除时间前面的日期吗?我想获得整个月内每个时间间隔的平均值(即 30 个样本日)
  • 需要更多调整。 1)。需要删除日期区别,因为我有兴趣捕获整个月内每个时间间隔的平均重量(即 30 个采样日)2)。时间间隔与结果不连续。它只显示有包裹的时间间隔。我需要显示所有时间间隔,如果没有包裹,只需报告 0。
猜你喜欢
  • 2018-12-13
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 2018-05-27
  • 2020-05-26
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多