【问题标题】:Add workdays to pandas df date columns based of other column根据其他列将工作日添加到 pandas df 日期列
【发布时间】:2020-07-16 01:48:08
【问题描述】:

有没有办法将 pandas 数据框中的日期字段增加另一列中指定的工作日数?

np.random.seed(10)
df = pd.DataFrame({'Date':pd.date_range(start=dt.datetime(2020,7,1), end = dt.datetime(2020,7,10))})
df['Offset'] = np.random.randint(0,10, len(df))

        Date  Offset
0 2020-07-01       9
1 2020-07-02       4
2 2020-07-03       0
3 2020-07-04       1
4 2020-07-05       9
5 2020-07-06       0
6 2020-07-07       1
7 2020-07-08       8
8 2020-07-09       9
9 2020-07-10       0

我希望这可以工作,但是它会抛出错误:

df['Date'] + pd.tseries.offsets.BusinessDay(n = df['Offset']) 

TypeError: n 参数必须是整数,得到

pd.to_timedelta 不支持工作日。

【问题讨论】:

  • df['Offset'] 是一个序列而不是整数,您试图将一个值偏移整个序列,因此会出现错误。您可能想查看apply() 并尝试在那里找到解决方案!
  • 对于大型 DataFrame,.apply 也可能非常慢。如果您有很多行并且只有少量唯一偏移量,则按偏移量进行分组会更有效:stackoverflow.com/questions/58174267/… 并将单个偏移量应用于每个组,然后组合结果。

标签: python-3.x pandas dataframe


【解决方案1】:

就像我在评论中提到的那样,您试图将整个系列作为整数传递。相反,您想apply 函数行明智:

df['your_answer'] = df.apply(lambda x:x['Date'] + pd.tseries.offsets.BusinessDay(n= x['Offset']), axis=1)

df
        Date  Offset your_answer
0 2020-07-01       9  2020-07-14
1 2020-07-02       7  2020-07-13
2 2020-07-03       3  2020-07-08
3 2020-07-04       2  2020-07-07
4 2020-07-05       7  2020-07-14
5 2020-07-06       7  2020-07-15
6 2020-07-07       7  2020-07-16
7 2020-07-08       2  2020-07-10
8 2020-07-09       1  2020-07-10
9 2020-07-10       0  2020-07-10

代码行分解:

# notice how this returns every value of that column
df.apply(lambda x:x['Date'], axis=1)

0   2020-07-01
1   2020-07-02
2   2020-07-03
3   2020-07-04
4   2020-07-05
5   2020-07-06
6   2020-07-07
7   2020-07-08
8   2020-07-09
9   2020-07-10

# same thing with `Offset`
df.apply(lambda x:x['Offset'], axis=1)
0    9
1    7
2    3
3    2
4    7
5    7
6    7
7    2
8    1
9    0

因为pd.tseries.offsets.BusinessDay(n=foo_bar) 采用整数而不是系列。我们将apply() 中的两列一起使用 - 就像您将Offset 列中的每个数字循环到offsets.BusinessDay() 函数中一样

【讨论】:

  • 太棒了!非常感谢
猜你喜欢
  • 1970-01-01
  • 2015-10-13
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
  • 2021-08-13
相关资源
最近更新 更多