簡體   English   中英

根據天計算與 pandas 日期時間列的差異的有效方法

[英]Efficient way to calculate difference from pandas datetime columns based on days

我有一個 dataframe 有幾百萬行,我想每天計算日期時間格式的兩列之間的差異。

有堆棧溢出問題可以回答這個問題,在時間戳的基礎上計算差異( 見這里

在時間戳的基礎上做起來感覺相當快: 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)

使用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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM