我正在尝试获取数据集中假期的虚拟变量。我有几个带假日的日期范围(pd.daterange()
)和一个数据框,我想在该数据框后面附加一个虚拟对象,以指示该行的日期时间是否在指定假日的某个日期范围内。
小例子:
ChristmasBreak = list(pd.date_range('2014-12-20','2015-01-04').date)
dates = pd.date_range('2015-01-03', '2015-01-06, freq='H')
d = {'Date': dates, 'Number': np.rand(len(dates))}
df = pd.DataFrame(data=d)
df.set_index('Date', inplace=True)
for i, row in df.iterrows():
if i in ChristmasBreak:
df[i,'Christmas] = 1
if loop
从未输入,因此无法匹配日期。有什么办法吗?也欢迎使用其他替代方法来处理这种情况!
答案 0 :(得分:2)
首先不要使用 iterrows ,因为really slow。
最好将dt.date
与Series,isin
一起使用,最后将布尔掩码转换为整数-True
是1
:
df = pd.DataFrame(data=d)
df['Christmas'] = df['Date'].dt.date.isin(ChristmasBreak).astype(int)
或使用between
:
df['Christmas'] = df['Date'].between('2014-12-20', '2015-01-04').astype(int)
如果要与DatetimeIndex
进行比较:
df = pd.DataFrame(data=d)
df.set_index('Date', inplace=True)
df['Christmas'] = df.index.date.isin(ChristmasBreak).astype(int)
df['Christmas'] = ((df.index > '2014-12-20') & (df.index < '2015-01-04')).astype(int)
示例:
ChristmasBreak = pd.date_range('2014-12-20','2015-01-04').date
dates = pd.date_range('2014-12-19 20:00', '2014-12-20 05:00', freq='H')
d = {'Date': dates, 'Number': np.random.randint(10, size=len(dates))}
df = pd.DataFrame(data=d)
df['Christmas'] = df['Date'].dt.date.isin(ChristmasBreak).astype(int)
print (df)
Date Number Christmas
0 2014-12-19 20:00:00 6 0
1 2014-12-19 21:00:00 7 0
2 2014-12-19 22:00:00 0 0
3 2014-12-19 23:00:00 9 0
4 2014-12-20 00:00:00 1 1
5 2014-12-20 01:00:00 3 1
6 2014-12-20 02:00:00 1 1
7 2014-12-20 03:00:00 8 1
8 2014-12-20 04:00:00 2 1
9 2014-12-20 05:00:00 1 1
答案 1 :(得分:0)
这应该做您想要的:
df['Christmas'] = df.index.isin(ChristmasBreak).astype(int)