【问题标题】:I am trying to assign a Holiday classifier to a list of dates我正在尝试将假期分类器分配给日期列表
【发布时间】:2019-04-25 20:27:37
【问题描述】:

我有两个数据框,一个带有日期列表及其对应的假期 (df2),另一个带有交易列表 (df1)。我正在尝试使用第一个在第二个上标记假期,但是每当我尝试创建一个函数并应用它时,它只会为所有内容返回空值。

我使用的函数如下:

    def isHoliday(t, holiday_list):
        f = t.strftime('%Y-%m-%d')
        if(f in (holiday_list)):
            return 1
        else:
            return 0

当我尝试应用它时:

    df1.insert(3, 'isHoliday', df1['DATE'].apply(lambda x: isHoliday(x, 
    df2['DATE'])))

数据框只返回 0。我查找了date to date comparison,得到的答案是将它们作为字符串进行比较,因此为什么函数是以这种方式构造的。

我做错了什么?我已经将df2['DATE'] 列预格式化为具有相同strftime() 的字符串

我能想到的唯一直接替代方法是从一个 df 到另一个使用 df.lookup,但我不知道该怎么做。

【问题讨论】:

  • 你能分享数据帧的样本吗?
  • 试试:df1['isHoliday'] = df1['DATE'].isin(df2['DATE']).astype(int),记得把两个日期列设置成相同的格式
  • 当然。 df1 看起来像这样 pasteboard.co/IbOSmwX.png 和 df2 像这样 pasteboard.co/IbOSZMe.png 数据是西班牙语,但同样的原则适用。
  • @QuangHoang 我之前尝试过,连字符格式会阻止直接 int 解析。 --> int() 以 10 为底的无效文字:'2012-12-31'
  • 您应该以代码而不是图片的形式发布您的数据样本。这有助于人们更快地帮助您:-)。

标签: python pandas datetime data-manipulation


【解决方案1】:

要使 if 语句执行您期望的操作,您需要从 df2['DATE'] 操作返回的 Series 中获取一个列表或一个 numpy 数组。您可以使用.values 属性或将系列转换为列表list(df2['DATE'])

import pandas as pd
df2 = pd.DataFrame(data=[['2014-01-02'], ['2014-01-03']], columns=['DATE'])
print('2014-01-02' in df2['DATE']) # false
print('2014-01-02' in df2['DATE'].values) # true
print('2014-01-02' in list(df2['DATE'])) # true

或者,.str.contains() 方法可以比较所有字符串,然后any() 将查找是否匹配。

any(df2['DATE'].str.contains('2014-01-02', regex=False)) # true

【讨论】:

  • 谢谢!这就像一个魅力。两种方式都做到了。
【解决方案2】:

将您的系列转换为列表应该可以解决您的问题:

def isHoliday(t, holiday_list):
    f = t.strftime('%Y-%m-%d')
    if f in list(holiday_list):  # convert series to list
        return 1
    else:
        return 0

【讨论】:

  • 谢谢,这非常有帮助,因为我意识到系列分析与列表分析的属性不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多