我正在尝试将假日分类器分配给日期列表

时间:2019-04-25 20:27:37

标签: python pandas datetime data-manipulation

我有两个数据框,一个带有日期列表及其对应的假期(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使用df.lookup,但是我不确定该怎么做。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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