我有一个数据框df
,其索引为日期时间格式。我想创建7个新的二进制字段/列,以指示日期是星期一,星期二,星期三,星期四,星期五,星期六还是星期日。因此,例如,如果星期一是星期一,则星期一中将有1,否则为0。
是否有一种整齐的方法?我一直在尝试,但是我的解决方案非常难看。
答案 0 :(得分:2)
如果数据框例如:
>>> df
date
0 2018-01-01
1 2018-01-02
2 2018-01-03
3 2018-01-04
4 2018-01-05
5 2018-01-06
6 2018-01-07
7 2018-01-08
8 2018-01-09
9 2018-01-10
10 2018-01-11
11 2018-01-12
12 2018-01-13
13 2018-01-14
14 2018-01-15
15 2018-01-16
16 2018-01-17
17 2018-01-18
18 2018-01-19
19 2018-01-20
我们可以使用df['date'].dt.weekday
获得0
和6
之间的数字,该数字指定一周中的一天。
然后我们可以使用pd.get_dummies(…)
[pandas-doc]来生成“一次编码”:
>>> pd.concat((df, pd.get_dummies(df['date'].dt.weekday)), axis=1)
date 0 1 2 3 4 5 6
0 2018-01-01 1 0 0 0 0 0 0
1 2018-01-02 0 1 0 0 0 0 0
2 2018-01-03 0 0 1 0 0 0 0
3 2018-01-04 0 0 0 1 0 0 0
4 2018-01-05 0 0 0 0 1 0 0
5 2018-01-06 0 0 0 0 0 1 0
6 2018-01-07 0 0 0 0 0 0 1
7 2018-01-08 1 0 0 0 0 0 0
8 2018-01-09 0 1 0 0 0 0 0
9 2018-01-10 0 0 1 0 0 0 0
10 2018-01-11 0 0 0 1 0 0 0
11 2018-01-12 0 0 0 0 1 0 0
12 2018-01-13 0 0 0 0 0 1 0
13 2018-01-14 0 0 0 0 0 0 1
14 2018-01-15 1 0 0 0 0 0 0
15 2018-01-16 0 1 0 0 0 0 0
16 2018-01-17 0 0 1 0 0 0 0
17 2018-01-18 0 0 0 1 0 0 0
18 2018-01-19 0 0 0 0 1 0 0
19 2018-01-20 0 0 0 0 0 1 0
0
,1
,2
等是星期几。
对于日期名称,您可以改用.day_name()
:
>>> pd.concat((df, pd.get_dummies(df['date'].dt.day_name())), axis=1)
date Friday Monday Saturday Sunday Thursday Tuesday Wednesday
0 2018-01-01 0 1 0 0 0 0 0
1 2018-01-02 0 0 0 0 0 1 0
2 2018-01-03 0 0 0 0 0 0 1
3 2018-01-04 0 0 0 0 1 0 0
4 2018-01-05 1 0 0 0 0 0 0
5 2018-01-06 0 0 1 0 0 0 0
6 2018-01-07 0 0 0 1 0 0 0
7 2018-01-08 0 1 0 0 0 0 0
8 2018-01-09 0 0 0 0 0 1 0
9 2018-01-10 0 0 0 0 0 0 1
10 2018-01-11 0 0 0 0 1 0 0
11 2018-01-12 1 0 0 0 0 0 0
12 2018-01-13 0 0 1 0 0 0 0
13 2018-01-14 0 0 0 1 0 0 0
14 2018-01-15 0 1 0 0 0 0 0
15 2018-01-16 0 0 0 0 0 1 0
16 2018-01-17 0 0 0 0 0 0 1
17 2018-01-18 0 0 0 0 1 0 0
18 2018-01-19 1 0 0 0 0 0 0
19 2018-01-20 0 0 1 0 0 0 0