【问题标题】:Counting the business days between two series计算两个系列之间的工作日
【发布时间】:2019-03-09 08:26:36
【问题描述】:

有没有比 bdate_range() 更好的方法来通过 pandas 测量两列日期之间的工作日?

df = pd.DataFrame({ 'A' : ['1/1/2013', '2/2/2013', '3/3/2013'],
 'B': ['1/12/2013', '4/4/2013', '3/3/2013']})
print df
df['A'] = pd.to_datetime(df['A'])
df['B'] = pd.to_datetime(df['B'])
f = lambda x: len(pd.bdate_range(x['A'], x['B']))
df['DIFF'] = df.apply(f, axis=1)
print df

输出:

          A          B
0  1/1/2013  1/12/2013
1  2/2/2013   4/4/2013
2  3/3/2013   3/3/2013
                    A                   B  DIFF
0 2013-01-01 00:00:00 2013-01-12 00:00:00     9
1 2013-02-02 00:00:00 2013-04-04 00:00:00    44
2 2013-03-03 00:00:00 2013-03-03 00:00:00     0

谢谢!

【问题讨论】:

  • 可能重复:stackoverflow.com/questions/13019719/…(请参阅底部以计算天数,而不是列出它们。)
  • @DanAllan 感觉就像在做同样的事情,因为你正在创建一个中间日期范围......但是如果不这样做可能是不可能的。 :s
  • 是的,当然。如果您正在研究长距离,并且您只需要排除周末(但不包括假期),我希望构建一个自定义函数会更快,该函数使用 A 和 B 的星期几以及它们的总时间差来计算工作日数。
  • 在处理上述内容时,我查看了 numpy busday_count,但从元数据 [us] 到 [D] 的转换存在问题。 f = lambda x: np.busday_count(x['A'], x['B']).

标签: python pandas


【解决方案1】:

brian_the_bungler 使用 numpy 的 busday_count 找到了最有效的方法:

import numpy as np
A = [d.date() for d in df['A']]
B = [d.date() for d in df['B']]
df['DIFF'] = np.busday_count(A, B)
print df

在我的机器上,这在您的测试用例上快 300 倍,在更大的日期数组上快 1000 倍

【讨论】:

  • [Antonbass][1] 的另一种更简洁的语法是:df['DIFF'] = np.busday_count(df['A'].tolist(), df['B'].tolist()) df['DIFF'] = np.busday_count(df.index.date.tolist(), df['B'].tolist()) 如果使用索引作为日期列。 [1]:stackoverflow.com/users/2834466/antonbass
  • 请注意,此解决方案的结果与问题中的解决方案不同。这里的结果将是 [9, 43, 0] 而不是 [9, 44, 0]
猜你喜欢
  • 2010-09-20
  • 1970-01-01
  • 2018-08-03
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 2012-02-13
相关资源
最近更新 更多