我正在尝试使用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.
关键是获得超过两点的车辆的平均时间和行驶时间
要获取平均速度和旅程时间,您可以使用groupby()
或传递确定一个完整旅程的列,例如id
或area
。
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句