首页 > 解决方案 > 用python编写快速代码

问题描述

我有一个包含两个主要列的大型数据集,包括快递代码及其相关的交货日期和时间

CourierTrips.head()
  Courier Code    Delivery Date Time
0 1232011104      2019/04/15 18:38
1 1232011104      2019/04/15 12:00
2 1232011076      2019/04/15 14:00
3 1232011076      2019/04/15 12:10
4 1102095903      2019/04/15 18:01

我想确定每个工作日每个快递的最后交货时间。首先,我使用两个不同的代码将日期和时间列分成不同的列,其中一个代码比另一个代码快得多:

第一种方法(非常慢):

#Delivery Date
CourierTrips["Delivery_Date"]=""
for i in range(len(CourierTrips["Delivery_Date"])):
    CourierTrips["Delivery_Date"][i]=CourierTrips['Delivery Date Time'][i][:10]

#Delivery Time
CourierTrips["Delivery_Time"]=""
for i in range(len(CourierTrips["Delivery_Time"])):
    CourierTrips["Delivery_Time"][i]=CourierTrips['Delivery Date Time'][i][11::]

第二种方法(非常快):

#Delivery Date
CourierTrips["Delivery_Date"]=[u[:10] for u in CourierTrips['Delivery Date Time']]

#Delivery Time
CourierTrips["Delivery_Time"]=[u[11::] for u in CourierTrips['Delivery Date Time']]

上述两个代码在分离日期和时间值方面具有相同的结果,但第二种方法比第一种方法快得多。

然后,为了确定每个快递员在每个工作日的最后交货时间,我必须针对每个特定的快递员代码计算一天中“交货日期时间”列的最大值。因此,我可以编写下面的代码将结果保存在 End Time 列中。

CourierTrips["End_Time"]=""
for i in range(len(CourierTrips["End_Time"])):
    CourierTrips["End_Time"][i]=max(CourierTrips[(CourierTrips['Courier Code']==CourierTrips['Courier Code'][i]) & 
                     (CourierTrips["Delivery_Date"]==CourierTrips["Delivery_Date"][i])]['Delivery_Time'])

CourierTrips.head()
  Courier Code    Delivery Date Time  Delivery_Date   Delivery_Time   End_Time
0 1232011104      2019/04/15 18:38    2019/04/15      18:38           21:10
1 1232011104      2019/04/15 12:00    2019/04/15      12:00           21:10
2 1232011076      2019/04/15 14:00    2019/04/15      14:00           21:05
3 1232011076      2019/04/15 12:10    2019/04/15      12:10           21:05
4 1102095903      2019/04/15 18:01    2019/04/15      18:01           19:45

上面代码的结果是真的,可惜代码的执行时间太多了。我的数据集包含超过 100 万条记录,上面的代码花费了很多时间来获取结果。正如我所解释的,我可以编写一个快速代码来添加日期和时间列,但不幸的是,我找不到一个好的解决方案来编写一个快速代码来计算 End_Time 列的值。我的问题是,是否可以编写花费较少时间的代码来显示 End_Time 列的结果?如果有人可以通过回答我的问题来帮助我,我将不胜感激。

标签: pythonpandasnumpydataframe

解决方案


不要循环遍历pandas dataframe行。正如您已经亲眼所见,它永远不是答案。您可以通过以下方式找到每个的最新时间Courier Code

last_times = CourierTrips[['Courier Code', 'Delivery_Time']].groupby('Courier Code').max().reset_index()

然后将结果合并到CourierTripswith (而不是您编写的代码的整个最后一部分):

CourierTrips = CourierTrips.merge(last_times.rename({'Delivery_Time':'End_Time'}, axis=1), how='left')

推荐阅读