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

时间:2017-07-03 00:06:18

标签: python date dataframe weekday

我有一个包含数百万行的大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
...

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

1 个答案:

答案 0 :(得分:2)

尝试以下方法:

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))))

我希望这会有所帮助。