python - [Python, pandas]:每辆车每天跑公里
问题描述
我正在尝试输出一个表格,在那里我可以看到每辆车每天运行的公里数,但我得到的计算是错误的。
给出我所拥有的数据的一小部分。每辆车每天将其当前里程表读数发送到中央服务器数百次。
TS DATE VEH ODOMETER
2021-03-12 12:58:15.500 2021-03-12 008 2932
2021-03-12 00:00:21.700 2021-03-12 002 64253
2021-03-12 00:02:21.500 2021-03-12 002 64254
2021-03-12 00:03:41.400 2021-03-12 002 64255
2021-03-12 00:05:38.200 2021-03-12 002 64256
... ... ... ...
2021-03-12 23:55:88.100 2021-03-12 002 64953
2021-03-12 00:05:38.200 2021-03-13 002 64954
正如在上面的示例中应该清楚的那样,车辆 2 在 2021 年 3 月 12 日的第一个和最后一个里程表读数是 64953-64253 = 700 公里,但第二天的第一个读数是 64954,因此将 diff() 分组在当天的第一个和最后一个里程表值,有些公里正在消失,如下图
def grp_odo(dfObj):
dfObj['ODOMETER'] = dfObj['ODOMETER'].astype(int)
dfObj["km"] = dfObj.groupby(["DATE","VEH"])["ODOMETER"].diff()
sum_km = dfObj.groupby(["DATE","VEH"], as_index=False)["km"].sum()
return sum_km
dfodo = grp_odo(df[['DATE','VEH', 'ODOMETER']].loc[(~pd.isna(df['ODOMETER']))])
打印每天的 groupby 里程表差异:
print(dfodo)
DATE WSTRPVID km
0 2021-01-01 001 523.0
1 2021-01-01 002 700.0
2 2021-01-01 003 781.0
3 2021-01-01 004 2.0
4 2021-01-01 005 553.0
... ... ... ...
3375 2021-04-09 034 802.0
3376 2021-04-09 035 615.0
3377 2021-04-09 036 778.0
3378 2021-04-09 038 425.0
3379 2021-04-09 039 386.0
打印分组数据从开始到结束的总公里数。
print(dfodo[dfodo.VEH== "002"].sum())
km: 36796
打印数据框中最高和最低里程表值的总和
print(df[df.VEH== "002"].groupby('VEH')['ODOMETER'].agg(np.ptp))
VEH
002 36898
Name: ODOMETER, dtype: int64
我想要一个输出,其中 2021-03-12 是 701km,那么 2021-03-12 的第一个值和 2021-03-13 的第一个值之间的差异,这可能吗?
解决方案
输入:
>>> df
TS DATE VEH ODOMETER
0 2021-03-12 12:58:15.500 2021-03-12 008 2932.0
1 2021-03-12 00:00:21.700 2021-03-12 002 64253.0
2 2021-03-12 00:02:21.500 2021-03-12 002 64254.0
3 2021-03-12 00:03:41.400 2021-03-12 002 64255.0
4 2021-03-12 00:05:38.200 2021-03-12 002 64256.0
5 2021-03-12 23:55:48.100 2021-03-12 002 64953.0
6 2021-03-12 00:05:38.200 2021-03-13 002 64954.0
输出:
>>> df.assign(TOTAL=df.groupby("VEH")["ODOMETER"].shift(-1) - df["ODOMETER"]) \
.groupby(["DATE", "VEH"]).sum()["TOTAL"]
DATE VEH
2021-03-12 002 701.0
008 0.0
2021-03-13 002 0.0
Name: TOTAL, dtype: float64
推荐阅读
- prometheus - prometheus consul sd“刷新服务出错”
- google-chrome - 如何将scrapy shell中视图(响应)的输出更改为在chrome中打开?
- python - 来自透视/分组表的堆积条形图 Python
- android - 如何在 Android.bp 中导入 split_config.$arch.apk?
- python - 如何重新启动异步线程?
- c# - 如何访问另一个 C# 类/视图模型中的变量
- ionic-framework - 如何使用 ionic v3 在一个项目中集成两个或多个 google-services.json 文件
- javascript - 如何检查所选文本是否溢出到某个类
- python - 如何在 Kaggle 笔记本中升级 Scipy
- azure - 如何使用 Azure CLI 访问 AAD B2C 租户