为 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.where
和 isin
.
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
我有一个带有双索引(日期、时间)的数据框,如果索引日期属于假期列表,我想创建一个等于 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.where
和 isin
.
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