将日期指示器变量从日期添加到数据框的有效方法

Efficient way to add day indicator variable from date to data frame

我有一个很大的 DataFrame,有数百万行,其中一列是 date。我想向其中添加 5 列,工作日为 0/1。

dates = pd.date_range('1700-01-01', '2017-07-02')
df = pd.DataFrame({'date':dates, 'Values':np.random.normal(size = len(dates))})
df

          date      value
0   1700-01-01  -1.239422
1   1700-01-02  -0.209840
2   1700-01-03   0.146293
3   1700-01-04   1.422454
4   1700-01-05   0.453222
...

我正在努力实现如下:

df['isMonday'] = df.apply(lambda x: 1 if x['date'].weekday() == 0 else 0, axis=1)
df['isTuesday'] = df.apply(lambda x: 1 if x['date'].weekday() == 1 else 0, axis=1)
df['isWednesday'] = df.apply(lambda x: 1 if x['date'].weekday() == 2 else 0, axis=1)
df['isThursday'] = df.apply(lambda x: 1 if x['date'].weekday() == 3 else 0, axis=1)
df['isFriday'] = df.apply(lambda x: 1 if x['date'].weekday() == 4 else 0, axis=1)
df

          date      value  isMonday  isTuesday isWednesday isThursday isFriday
0   1700-01-01  -1.239422        0           0           0          0        1
1   1700-01-02  -0.209840        0           0           0          0        0
2   1700-01-03   0.146293        0           0           0          0        0
3   1700-01-04   1.422454        1           0           0          0        0
4   1700-01-05   0.453222        0           1           0          0        0
...

这很慢。实现这一目标的最有效方法是什么。

尝试以下操作:

df.join(pd.get_dummies("is"+df.date.dt.weekday_name))

应该产出:

#      Values       date  isFriday  isMonday  isSaturday  isSunday  isThursday  \
# 0  0.107486 1700-01-01         1         0           0         0           0   
# 1 -0.418628 1700-01-02         0         0           1         0           0   
# 2 -0.336569 1700-01-03         0         0           0         1           0   
# 3  0.322989 1700-01-04         0         1           0         0           0   
# 4 -1.025901 1700-01-05         0         0           0         0           0   
# 5 -0.297524 1700-01-06         0         0           0         0           0   
# 6  0.824080 1700-01-07         0         0           0         0           1   
# 7 -0.286943 1700-01-08         1         0           0         0           0   
# 8 -1.774486 1700-01-09         0         0           1         0           0   
# 9  1.029038 1700-01-10         0         0           0         1           0   

#    isTuesday  isWednesday  
# 0          0            0  
# 1          0            0  
# 2          0            0  
# 3          0            0  
# 4          1            0  
# 5          0            1  
# 6          0            0  
# 7          0            0  
# 8          0            0  
# 9          0            0 

这里发生的事情是您获取日期时间值的星期几名称并在它们前面加上字符串 "is"。一旦完成,您就可以将函数 pd.get_dummies 应用于结果。 pd.get_dummiespd.get_dummies 的输出中为每个值生成一列,并用 1 填充匹配的行,而不匹配的行用 0 填充。这将是一个新的数据框,您可以 join 到原始数据框。

编辑:

版本0.16.2解决方案:

weekday_names = {0: 'Monday',
                 1: 'Tuesday',
                 2: 'Wednesday',
                 3: 'Thursday',
                 4: 'Friday',
                 5: 'Saturday',
                 6: 'Sunday'}

df.join(pd.get_dummies("is"+df.date.dt.weekday.apply(lambda x: weekday_names.get(x))))

希望对您有所帮助。