为 pandas 中的日期列表创建虚拟值

Create dummy values for a list of dates in pandas

我有一个带有双索引(日期、时间)的数据框,如果索引日期属于假期列表,我想创建一个等于 1 的新列 'Holiday'。

我的 DatetimeIndex 类型假期列表:

holidays = ['2017-09-11', '2017-12-24']

我的原始数据框:

                       Visitor  
Date       Time                                                              
2017-09-11 4:45           0         
           5:00           1        
           5:15          26       
....
2017-09-12 4:45           0       
           5:00           1         
           5:15          26     
....

我想要的:

                       Visitor      Holiday  
Date       Time                                                              
2017-09-11 4:45           0           1         
           5:00           1           1         
           5:15          26           1         
....
2017-09-12 4:45           0           0         
           5:00           1           0         
           5:15          26           0        
....

这是我基于此 尝试的方法:

df['Holiday'] = int(df.index.get_level_values(0) in holidays == True)

但是我的列 'Holiday' 始终具有值 0...

提前致谢!

您当前的解决方案实际上应该抛出 ValueError:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

请注意,in 运算符适用于标量值,不适用于 pandas 数据帧。 pandas 相反,有很多重载的条件运算符和按位运算符,以及用于条件逻辑和布尔逻辑的综合 API 套件。


您可以使用 np.whereisin.

df['Holiday'] = np.where(df.index.get_level_values(0).isin(holidays), 1, 0)
df


                 Visitor  Holiday
Date       Time                  
2017-09-11 4:45        0        1
           5:00        1        1
           5:15       26        1
2017-09-12 4:45        0        0
           5:00        1        0
           5:15       26        0

通过从 get_level_values 获取日期级别来使用 isin,并使用 astype(int) 将布尔值转换为整数。

In [192]: df['Holiday'] = df.index.get_level_values(0).isin(holidays).astype(int)

In [193]: df
Out[193]:
                 Visitor  Holiday
Date       Time
2017-09-11 4:45        0        1
           5:00        1        1
           5:15       26        1
2017-09-12 4:45        0        0
           5:00        1        0
           5:15       26        0

如果你想要复制而不是修改df

In [196]: df.assign(Holiday=df.index.get_level_values(0).isin(holidays).astype(int))
Out[196]:
                 Visitor  Holiday
Date       Time
2017-09-11 4:45        0        1
           5:00        1        1
           5:15       26        1
2017-09-12 4:45        0        0
           5:00        1        0
           5:15       26        0