【问题标题】:How can I add/deduct a column of integer in Business Days to a column of datetime?如何将工作日中的整数列添加/减去日期时间列?
【发布时间】:2021-06-11 00:08:54
【问题描述】:

我的数据框如下:

ID Days of Holiday First Day of Holiday
A01 3 16/03/2021
B01 10 24/03/2021
C02 3 31/03/2021
D03 2 02/04/2021

我正在想办法创建另一列“假期返回的第一天”。

我尝试使用下面的 iterrow 循环 DF(上面的 DF 是“日历”):

for i, r in Calendar.iterrows():\
    Calendar["First Day of Return from holiday"] = Calendar["First Day of Holiday"] + pd.tseries.offsets.BDay(n = r["Days of Holiday"])

而且我没有得到正确的输出。

还有什么方法可以推荐给我吗?

基本上,寻找在工作日内将整数列添加/减去同一行的日期时间列的方法。

非常感谢!

【问题讨论】:

  • Days of Holiday 列是否包括周末或仅工作日?
  • Business Days的逻辑我修改了代码,你可以查看

标签: python pandas dataframe loops datetime


【解决方案1】:

你可以使用 lambda 函数:

df['First Day of Return from holiday'] = df.apply(lambda row: row.['First Day of Holiday'] + row.['Days of Holiday'], axis=1)

【讨论】:

    【解决方案2】:

    首先我们将假期日期的第一天转换为datetime 数据类型,将假期数转换为int 数据类型,然后我们以零开始新列。我们可以使用 BDay 函数迭代并将值分配给新列的每一行以获取工作日。然后我们可以将日期转换回我们需要的日期格式。

    但是,日期将被转换为标准格式,可以使用.dt.strftime('%d/%m/%Y') 转换回所需的格式

    import pandas as pd
    from pandas.tseries.offsets import BDay
    
    df['First Day of Holiday'] = pd.to_datetime(df['First Day of Holiday'])
    df['Days of Holiday'] = df['Days of Holiday'].astype('int')
    df['First Day of Return from holiday'] = [0]*len(df.index)
    for i, r in df.iterrows():
        df.loc[i, 'First Day of Return from holiday'] = r['First Day of Holiday'] + BDay(n=r['Days of Holiday'])
    df['First Day of Holiday'] = df['First Day of Holiday'].dt.strftime('%d/%m/%Y')
    df['First Day of Return from holiday'] = pd.to_datetime(df['First Day of Return from holiday'])
    df['First Day of Return from holiday'] = df['First Day of Return from holiday'].dt.strftime('%d/%m/%Y')
    df
    

    输出

    【讨论】:

    • 这完全有效!谢谢你。您对商务假期有其他建议吗?目前,“假期返回的第一天”仅不包括我认为的周末。但是在其他国家,比如在韩国,我有一个商务假期列表,需要将其排除在假期返回的第一天之外。
    • @VbC 你应该检查 Pandas 的 CustomBusinessDay 功能,这里是参考文档pandas.pydata.org/docs/reference/api/…
    • @VbC 这里他们展示了如何创建一个定制的假日日历towardsdatascience.com/…
    • @VbC 如果它解决了您的问题,您会考虑验证此答案是否正确吗?
    猜你喜欢
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 2023-02-08
    相关资源
    最近更新 更多