【问题标题】:Adding business days to python将工作日添加到 python
【发布时间】:2020-03-31 08:03:23
【问题描述】:

在 Pandas 数据框上工作 -

我有一个这样的日期格式:datetime64[ns] 和一个 int64 格式的列。

数据框如下所示:

           date    days        
0    2019-07-04       1 
1    2019-10-17       1 
2    2019-10-17       2 

我想用这个功能增加n个工作日:

def add_business_days(from_date,ndays):
    business_days_to_add = abs(ndays)
    current_date = from_date
    sign = ndays/abs(ndays)
    while business_days_to_add > 0:
        current_date += datetime.timedelta(sign * 1)
        weekday = current_date.weekday()
        if weekday >= 5: # sunday = 6
            continue
        business_days_to_add -= 1
    return current_date

但我不知何故得到了这个错误:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

你能帮忙吗?

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    pandas 已实施对工作日的支持。我不确定你的输出应该是什么样的(因为你没有包含预期的输出,你能添加它吗?),但我想这就是你想要的:

    pd.to_datetime(from_date) + pd.offsets.BDay(ndays)
    

    假设您的数据框如下所示:

    dates = [pd.to_datetime('2019-07-04'), pd.to_datetime('2019-10-17'), pd.to_datetime('2019-10-17')]
    df = pd.DataFrame(data={'date': dates, 'days': [1, 1, 2]})
    

    可以省略转换为带有pd.to_datetime() 的时间戳。

    【讨论】:

    • TypeError: 'n' argument must be an integer, got <class 'pandas.core.series.Series'>
    • 对不起,我只看到我的解决方案后 5 分钟编辑,它是相同的,所以你可以添加到答案 - 使用另一个解决方案,而不是复制它。现在也很糟糕 - 你的错误答案被接受了:(
    • 是的,我多次编辑了对您答案的粗体引用,以试图清楚地表明答案的那部分来自您。正如我所说:这是一种表扬,而不是一种冒犯!此外,我的解决方案将与您的答案几乎完全一样。看看我在你之前发布的内容。这完全是您的功能的回报。所以我也可以抱怨你复制了它并把它变成了一个函数。但是恕我直言,这很愚蠢,因为它是使用 pandas 的最“直截了当”的解决方案,因此代码很可能大部分是一致的。
    • 所以恕我直言,抱怨我接受了您的回答并编辑我的帖子不是正确的方法。我本可以对你的函数返回线说同样的话......为什么它不好,什么是坏的?我的回答也没有错(除了一个单一的错字),也不错。
    • yop,好的,您的解决方案还不错,只是不适用于数据。这里有必要申请。
    【解决方案2】:

    将 lambda 函数与 offsets.BDay 一起使用:

    def add_business_days(from_date,ndays):
        return from_date + pd.offsets.BDay(ndays)
    
    df['date'] = pd.to_datetime(df['date'])
    df['new'] = df.apply(lambda x: add_business_days(x['date'], x['days']), axis=1)
    

    或者:

    df['new'] = df.apply(lambda x: x['date'] +  pd.offsets.BDay(x['days']), axis=1)
    

    print (df)
            date  days        new
    0 2019-07-04     1 2019-07-05
    1 2019-10-17     1 2019-10-18
    2 2019-10-17     2 2019-10-21
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-28
      • 1970-01-01
      • 2016-12-04
      • 2017-04-05
      • 2015-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多