首页 > 解决方案 > 基于时间的点之间的平均值

问题描述

我正在尝试使用 Python 来获取时间,以及在点之间移动的对象之间的平均速度。

数据看起来有点像这样,

location    initialtime id  speed distance
    1   2020-09-18T12:03:14.485952Z car_uno 72 9km
    2   2020-09-18T12:10:14.485952Z car_uno 83 8km
    3   2020-09-18T11:59:14.484781Z car_duo 70 9km
    7   2020-09-18T12:00:14.484653Z car_trio    85 8km
    8   2020-09-18T12:12:14.484653Z car_trio    70 7.5km

我目前使用的功能基本上是这样的,

Speeds.index = pd.to_datetime(Speeds.index)
..etc

现在,如果我通常这样做,我只会采用 id 的唯一值,

for x in speeds.id.unique():
    Speeds[speeds.id=="x"]...

但是这种方法确实行不通。

简单地查看随着时间的推移是否有多个 id 点,然后取给定时间的平均速度的最佳方法是什么?否则,如果没有多个值,则只返回速度本身。

我可以使用更简单的熊猫过滤器吗?

预期输出很简单,

area - id - initial time - journey time - average speed.
关键是要获得经过两点的车辆的平均时间和行程时间

标签: pythonpandas

解决方案


要获得平均速度和行程时间,您可以使用groupby()并传入确定完整行程的列,例如idarea

import pandas as pd
from io import StringIO

data = StringIO("""
area    initialtime id  speed
    1   2020-09-18T12:03:14.485952Z car_uno 72
    2   2020-09-18T12:10:14.485952Z car_uno 83
    3   2020-09-18T11:59:14.484781Z car_duo 70
    7   2020-09-18T12:00:14.484653Z car_trio    85
    8   2020-09-18T12:12:14.484653Z car_trio    70
""")

df = pd.read_csv(data, delim_whitespace=True)

df["initialtime"] = pd.to_datetime(df["initialtime"])

# change to ["id", "area"] if need more granular aggregation
group_cols = ["id"]

time = df.groupby(group_cols)["initialtime"].agg([max, min]).eval('max-min').reset_index(name="journey_time")

speed = df.groupby(group_cols)["speed"].mean().reset_index(name="average_speed")

pd.merge(time, speed, on=group_cols)

         id journey_time  average_speed
0   car_duo     00:00:00           70.0
1  car_trio     00:12:00           77.5
2   car_uno     00:07:00           77.5

推荐阅读