我正在尝试将以下.apply转换转换为矢量化形式,以使其运行速度更快。我尝试了.where,也尝试了常规的布尔索引,但是我的解决方案无法正常工作。请按正确的方向发送给我

oneDayDelta = datetime.timedelta(days=1)
def correct_gps_datetimestamp(row):
    new_dts = row['GPS_DateTime']
    if row['Created'].hour == 0 and  row['GPS_DateTime'].hour > 10:
        new_dts = row['GPS_DateTime'] - oneDayDelta
    return(new_dts)

allData['GPS_DateTime'] = allData.apply(correct_gps_datetimestamp,axis=1)


非工作解决方案:

allData['GPS_DateTime'] = allData.where(allData['Created'].hour == 0 & allData['GPS_DateTime'].hour > 10,allData['GPS_DateTime'] - datetime.timedelta(days=1))

最佳答案

您可以使用np.where在一行中完成此操作:

allData['GPS_DateTime'] = np.where((allData['Created'].dt.hour == 0) &  (allData['GPS_DateTime'].dt.hour > 10), allData['GPS_DateTime'] - oneDayDelta, allData['GPS_DateTime'])


请注意,datetimes具有dt.hour访问器来获取小时作为int值,这使您可以比较整个df,请注意,在比较数组时,此处我们使用&而不是and。另外,由于运算符的优先级,我们必须在条件周围使用括号。

(allData['Created'].dt.hour == 0) &  (allData['GPS_DateTime'].dt.hour > 10)


因此,在满足此条件的情况下,它将返回您的datetime列减去一个数据timedelta,否则它将仅返回您的列

关于python - Python Pandas。将函数应用于矢量化形式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39660466/

10-10 14:43