【问题标题】:Counting business days between subsequent pandas dataframe rows计算后续熊猫数据框行之间的工作日
【发布时间】:2020-02-02 02:11:41
【问题描述】:

我有大型 pandas 数据框(超过 1000000 行),我需要以最快的方式获取两行(n 和 n+1)之间的工作日数(不包括周末),其中每行包含一个列日期。每次,我都需要将持续时间(结果)存储在同一数据帧的第 n 行中的一个名为“持续时间”的列中。结果以秒为单位。

我正在使用以下代码以我所知道的最快方式进行计算(欢迎任何更好的方式;-))。

    tmp_df['duration'] = 
    tmp_df['origin_tick_generation_time_stamp'].shift(-1) - tmp_df[
            'origin_tick_generation_time_stamp']

我想在我的代码中计算没有周末的持续时间。我读到 np.busday_count(date1, date2) 会做到这一点。但不知道如何在我的情况下使用它。 有办法吗?

非常感谢

【问题讨论】:

  • 你有 100 万个约会对象?
  • 我还有更多。这些不仅仅是日期。每行都有一个操作日期,我正在计算两次操作之间的持续时间。操作是银行交易的活动。我需要以工作日为单位的持续时间。

标签: python pandas numpy


【解决方案1】:

使用pandas.Series.diff:

tmp_df['duration'] = tmp_df['origin_tick_generation_time_stamp'].diff(-1)*-1

tmp_df['duration'] = tmp_df['origin_tick_generation_time_stamp'].diff()*shift(-1)

它更快。

示例:

import numpy as np
df=pd.DataFrame()
df['a']=np.arange(1000000)
import time

start_time = time.time()
df['a'].shift(-1)-df['a']
elapsed_time = time.time() - start_time
print(elapsed_time)


#0.023838520050048828

start_time = time.time()
df['a'].diff(-1)*-1
elapsed_time = time.time() - start_time
print(elapsed_time)
#0.008615493774414062

start_time = time.time()
df['a'].diff().shift(-1)
elapsed_time = time.time() - start_time
print(elapsed_time)
#0.011868000030517578

【讨论】:

  • 谢谢,我试试。您知道如何通过这种方式将两行之间的差异编程为工作日而不是完整日历日吗?
猜你喜欢
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
  • 1970-01-01
  • 2016-10-17
  • 2021-09-18
  • 2019-01-16
相关资源
最近更新 更多