一种基于日期计算与Pandas日期时间列差异的有效方法

zu0ti5jz  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(158)

我有一个包含几百万行的 Dataframe ,我想每天计算两个日期时间格式的列之间的差异。
有一些堆栈溢出问题可以回答这个问题,即基于时间戳计算差值(see here
基于时间戳进行操作感觉相当快:df["Differnce"] = (df["end_date"] - df["start_date"]).dt.days
但是每天都这样做感觉很慢:df["Differnce"] = (df["end_date"].dt.date - df["start_date"].dt.date).dt.days
我想知道是否有一种简单但更好/更快的方法来达到同样的结果?
示例代码:

import pandas as pd
import numpy as np

data = {'Condition' :["a", "a", "b"],
        'start_date': [pd.Timestamp('2022-01-01 23:00:00.000000'), pd.Timestamp('2022-01-01 23:00:00.000000'), pd.Timestamp('2022-01-01 23:00:00.000000')],
        'end_date': [pd.Timestamp('2022-01-02 01:00:00.000000'), pd.Timestamp('2022-02-01 23:00:00.000000'), pd.Timestamp('2022-01-02 01:00:00.000000')]}

df = pd.DataFrame(data)

df["Right_Difference"] = np.where((df["Condition"] == "a"), ((df["end_date"].dt.date - df["start_date"].dt.date).dt.days), np.nan)
df["Wrong_Difference"] = np.where((df["Condition"] == "a"), ((df["end_date"] - df["start_date"]).dt.days), np.nan)
gr8qqesn

gr8qqesn1#

使用Series.dt.to_period,速度较快的是Series.dt.normalizeSeries.dt.floor

#300k rows
df = pd.concat([df] * 100000, ignore_index=True)

In [286]: %timeit (df["end_date"].dt.date - df["start_date"].dt.date).dt.days
1.14 s ± 135 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [287]: %timeit df["end_date"].dt.to_period('d').astype('int') - df["start_date"].dt.to_period('d').astype('int')
64.1 ms ± 3 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [288]: %timeit (df["end_date"].dt.normalize() - df["start_date"].dt.normalize()).dt.days
27.7 ms ± 316 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [289]: %timeit (df["end_date"].dt.floor('d') - df["start_date"].dt.floor('d')).dt.days
27.7 ms ± 937 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

相关问题