Python [蟒蛇,熊猫]:每辆车每天跑公里
我试图输出一个表格,在那里我可以看到每辆车每天行驶的公里数, 但我得到的计算结果是错误的 给我一个小片段的数据。 每辆车每天向中央服务器发送几百次当前里程表读数Python [蟒蛇,熊猫]:每辆车每天跑公里,python,pandas,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 202
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
如上例所示,2021-03-12车辆2的第一个和最后一个里程表读数为64953-64253=700 km
但是第二天的第一个读数是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 = pd.DataFrame({'DATE': ['2021-03-12', '2021-03-12', '2021-03-12', '2021-03-12', '2021-03-12', '2021-03-12', '2021-03-13'],
'VEH': ['008', '002', '002', '002', '002', '002', '002',],
'ODOMETER': [2932, 64253, 64254, 64255, 64256, 64953, 64954]})
df.sort_values(['VEH', 'DATE'], inplace=True)
DATE VEH ODOMETER
1 2021-03-12 002 64253
2 2021-03-12 002 64254
3 2021-03-12 002 64255
4 2021-03-12 002 64256
5 2021-03-12 002 64953
6 2021-03-13 002 64954
0 2021-03-12 008 2932
创建一列,该列采用每辆车的最小里程表值,日期组
dff = df.groupby(['VEH', 'DATE'], as_index=False).agg({'ODOMETER': 'min'})
VEH DATE ODOMETER
0 002 2021-03-12 64253
1 002 2021-03-13 64954
2 008 2021-03-12 2932
车辆组的每个日期之间的差值
dff['TOTAL_DIST'] = dff.groupby('VEH')['ODOMETER'].shift(-1)-dff.groupby('VEH')['ODOMETER'].shift(0)
VEH DATE ODOMETER TOTAL_DIST
0 002 2021-03-12 64253 701.0
1 002 2021-03-13 64954 NaN
2 008 2021-03-12 2932 NaN
创建一列,该列采用每辆车的最小里程表值,日期组
dff = df.groupby(['VEH', 'DATE'], as_index=False).agg({'ODOMETER': 'min'})
VEH DATE ODOMETER
0 002 2021-03-12 64253
1 002 2021-03-13 64954
2 008 2021-03-12 2932
车辆组的每个日期之间的差值
dff['TOTAL_DIST'] = dff.groupby('VEH')['ODOMETER'].shift(-1)-dff.groupby('VEH')['ODOMETER'].shift(0)
VEH DATE ODOMETER TOTAL_DIST
0 002 2021-03-12 64253 701.0
1 002 2021-03-13 64954 NaN
2 008 2021-03-12 2932 NaN
输入:
输出:
>>> 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
输入:
输出:
>>> 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
您可以使用2个连续的和,如下所示:
df_daily = df.groupby(['DATE', 'VEH'], as_index=False)['ODOMETER'].first()
df_daily['km_diff'] = df_daily.groupby('VEH')['ODOMETER'].shift(-1) - df_daily.groupby('VEH')['ODOMETER'].shift(0)
试运行
测试数据构造
cols= ['TS', 'DATE', 'VEH', 'ODOMETER']
data = [
['2021-03-12 12:58:15.500', '2021-03-12', '008' , 2932],
['2021-03-13 12:58:15.500', '2021-03-13', '008' , 3032],
['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]
]
df = pd.DataFrame(data, columns=cols)
print(df)
TS DATE VEH ODOMETER
0 2021-03-12 12:58:15.500 2021-03-12 008 2932
1 2021-03-13 12:58:15.500 2021-03-13 008 3032 <=== Added this test data
2 2021-03-12 00:00:21.700 2021-03-12 002 64253
3 2021-03-12 00:02:21.500 2021-03-12 002 64254
4 2021-03-12 00:03:41.400 2021-03-12 002 64255
5 2021-03-12 00:05:38.200 2021-03-12 002 64256
6 2021-03-12 23:55:88.100 2021-03-12 002 64953
7 2021-03-12 00:05:38.200 2021-03-13 002 64954
结果:
print(df_daily)
DATE VEH ODOMETER km_diff
0 2021-03-12 002 64253 701.0
1 2021-03-12 008 2932 100.0
2 2021-03-13 002 64954 NaN
3 2021-03-13 008 3032 NaN
您可以使用2个连续的和,如下所示:
df_daily = df.groupby(['DATE', 'VEH'], as_index=False)['ODOMETER'].first()
df_daily['km_diff'] = df_daily.groupby('VEH')['ODOMETER'].shift(-1) - df_daily.groupby('VEH')['ODOMETER'].shift(0)
试运行
测试数据构造
cols= ['TS', 'DATE', 'VEH', 'ODOMETER']
data = [
['2021-03-12 12:58:15.500', '2021-03-12', '008' , 2932],
['2021-03-13 12:58:15.500', '2021-03-13', '008' , 3032],
['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]
]
df = pd.DataFrame(data, columns=cols)
print(df)
TS DATE VEH ODOMETER
0 2021-03-12 12:58:15.500 2021-03-12 008 2932
1 2021-03-13 12:58:15.500 2021-03-13 008 3032 <=== Added this test data
2 2021-03-12 00:00:21.700 2021-03-12 002 64253
3 2021-03-12 00:02:21.500 2021-03-12 002 64254
4 2021-03-12 00:03:41.400 2021-03-12 002 64255
5 2021-03-12 00:05:38.200 2021-03-12 002 64256
6 2021-03-12 23:55:88.100 2021-03-12 002 64953
7 2021-03-12 00:05:38.200 2021-03-13 002 64954
结果:
print(df_daily)
DATE VEH ODOMETER km_diff
0 2021-03-12 002 64253 701.0
1 2021-03-12 008 2932 100.0
2 2021-03-13 002 64954 NaN
3 2021-03-13 008 3032 NaN
我不确定我收到的哪些输入是最好的,但这似乎是最简单的,而且似乎做得很好,所以我接受了你的。非常感谢所有的贡献者!我不确定我收到的哪些输入是最好的,但这似乎是最简单的,而且似乎做得很好,所以我接受了你的。非常感谢所有的贡献者!