在 DataFrame pandas 中为日期和年份创建布尔列

Create boolean columns in DataFrame pandas for date and year

让它成为下面的Python Panda DataFrame:

code date color counter
TTT 2021-02-01 00:30:11 blue 2
AVC 2022-02-01 10:00:01 red 12
BCH 2022-02-02 22:00:01 red 12
POD 2022-03-01 01:00:03 blue 1
UDY 2022-05-01 09:02:01 red 3
YUD 2022-12-01 09:02:01 green 0

我需要按年和月创建一个列,其中包括该行是否属于 (bool) 列中指示的特定月份。生成的DataFrame示例如下:

code date color counter 2021-02 2022-02 2022-03 2022-05 2022-12
TTT 2021-02-01 00:30:11 blue 2 True False False False False
AVC 2022-02-01 10:00:01 red 12 False True False False False
BCH 2022-02-02 22:00:01 red 12 False True False False False
POD 2022-03-01 01:00:03 blue 1 False False True False False
UDY 2022-05-01 09:02:01 red 3 False False False True False
YUD 2022-12-01 09:02:01 green 0 False False False False True

为了解决这个问题,只使用了 date 列中的信息,但我包含了完整的 DataFrame 以避免不兼容。

YYYY-MM 格式使用 get_dummies with Series.dt.strftime,对布尔值使用参数 dtype

df = df.join(pd.get_dummies(df['date'].dt.strftime('%Y-%m'), dtype=bool))
print (df)
  code                date  color  counter  2021-02  2022-02  2022-03  \
0  TTT 2021-02-01 00:30:11   blue        2     True    False    False   
1  AVC 2022-02-01 10:00:01    red       12    False     True    False   
2  BCH 2022-02-02 22:00:01    red       12    False     True    False   
3  POD 2022-03-01 01:00:03   blue        1    False    False     True   
4  UDY 2022-05-01 09:02:01    red        3    False    False    False   
5  YUD 2022-12-01 09:02:01  green        0    False    False    False   

   2022-05  2022-12  
0    False    False  
1    False    False  
2    False    False  
3    False    False  
4     True    False  
5    False     True  

您可以尝试 df.to_periodstr.get_dummies

out = df.join(pd.to_datetime(df['date']).dt.to_period("M")
              .astype(str).str.get_dummies()
              .astype(bool))
print(out)

  code                 date  color  counter  2021-02  2022-02  2022-03  2022-05  2022-12
0  TTT  2021-02-01 00:30:11   blue        2     True    False    False    False    False
1  AVC  2022-02-01 10:00:01    red       12    False     True    False    False    False
2  BCH  2022-02-02 22:00:01    red       12    False     True    False    False    False
3  POD  2022-03-01 01:00:03   blue        1    False    False     True    False    False
4  UDY  2022-05-01 09:02:01    red        3    False    False    False     True    False
5  YUD  2022-12-01 09:02:01  green        0    False    False    False    False     True