首页 > 解决方案 > 我正在尝试将假期分类器分配给日期列表

问题描述

我有两个数据框,一个带有日期列表及其相应的假期(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。我已经查看了最新比较,我从中得到的答案是将它们作为字符串进行比较,因此为什么函数是以这种方式构造的。

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

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

标签: pythonpandasdatetimedata-manipulation

解决方案


要使 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

推荐阅读