【问题标题】:AttributeError: 'Series' object has no attribute 'isoweekday'AttributeError:“系列”对象没有属性“isoweekday”
【发布时间】:2020-04-04 20:35:55
【问题描述】:

我写了一个函数,它可以根据周末和节假日将日期移动指定的工作日数。当我将它与标量值一起使用时它工作正常,但是我在尝试在 pandas DataFrame 上使用时遇到了问题。 函数本身如下所示:

def move_date_by_days(init_date, roll=1, nwd_key=None, hol_key=None):
    '''
    moves date by n-number of working days forward or backward
    init_date: date, initial caluclation date
    roll: integer, number of days to move forward (+) or backward (-)
    nwd_key: string that stands for currency iso code, it is a key in non_working_days dictionary
    hol_key: string that stands for currency iso code, it is a key in holidays dictonary
    return: date
    '''
    nwd = non_working_days.get(nwd_key, [])
    hol = holidays.get(hol_key,[])
    moved_date = init_date + datetime.timedelta(days=roll)
    if (moved_date.isoweekday() in nwd) or (moved_date in hol):
        if roll >= 0:
            moved_date=move_date_by_days(init_date + datetime.timedelta(days=1), roll=roll, nwd_key=nwd_key, hol_key=hol_key)
        else:
            moved_date=move_date_by_days(init_date + datetime.timedelta(days=-1), roll=roll, nwd_key=nwd_key, hol_key=hol_key)
    return moved_date

现在,我有 DataFrame 'df' 与列 'start_date' 和 'end_date'

   start_date    end_date
0  2020-01-31  2020-04-30
1  2020-04-30  2020-07-31
2  2020-07-31  2020-10-31
3  2020-10-31  2020-11-28

我想创建名为“fixing”的第三列,该列将在“start_date”之前的 2 个工作日。我正在尝试这个:

dates_table['fixing'] = move_date_by_days(self.dates_table['start_date'], -2, self.ccy, self.ccy)

但它返回AttributeError: 'Series' object has no attribute 'isoweekday'

请注意,例如,当我引用 DataFrame 的标量数据时,该函数可以正常工作

d1 = s1.dates_table.iat[0,0]
move_date_by_days(d1, -2, 'pln', 'pln')

它返回我所期望的:datetime.date(2020, 1, 29)

请提示我如何在数据框的整个列上使用该函数?

【问题讨论】:

  • 这是问题所在:moved_date.isoweekday(),试试moved_date.dt.isoweekday()。但是你不能使用or。尝试查找np.where
  • 不,moved_date.dt.isoweekday() 不起作用,(这个 dt 指的是我假设的日期时间,对吧?)你将如何使用 np.where

标签: python pandas dataframe attributeerror


【解决方案1】:

iiuc,为什么不使用@ 987654321或@ 487654322 @,它holidays

df['fixing'] = df['start_date'] - pd.offsets.BDay(2)
df['fixing'] = df['start_date'] - pd.offsets.CustomBusinessDay(2, holidays=holidays['pln'])

[出]

  start_date   end_date     fixing
0 2020-01-31 2020-04-30 2020-01-29
1 2020-04-30 2020-07-31 2020-04-28
2 2020-07-31 2020-10-31 2020-07-29
3 2020-10-31 2020-11-28 2020-10-29

【讨论】:

  • 嗯,我已经写了整个模块,根据不同的公约(of-hone,遵循的修改后面等)的滚动日期主要是我找不到什么我需要内在的内在功能。现在我试图弄清楚为什么这个函数有熊猫问题。我知道我可以通过在数据帧之外计算fixing_date然后合并它,但我想知道是否有更好的解决方案,或者我可以以某种方式修改我自己的函数,太疯狂地与pandas合作
  • 你试试Series.apply ..? df['fixing'] = df['start_date'].apply(lambda x: move_date_by_days(x, roll=-2, hol_key='pln', nwd_key='pln')) ..? span>
  • 是的!这是一个工作!非常感谢你,我扫除了这个lambda解决方案,但我不知道如何在我的功能方面实施它。非常感谢。
  • @ halny很高兴它帮助:) span>
猜你喜欢
  • 2020-11-11
  • 2019-04-22
  • 2019-07-26
  • 2019-09-16
  • 2017-12-12
  • 2018-05-25
  • 2019-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多