为Pandas DataFrame中各日期添加相对月份的周数列
Pandas 按每月日期区间新增周数列
问题描述
现有如下Pandas DataFrame:
| date | other_columns |
|---|---|
| 2022-02-06 | row |
| 2022-02-07 | row |
| 2022-02-08 | row |
| 2022-02-15 | row |
| 2022-02-24 | row |
| 2022-02-28 | row |
需要新增week列,按每月日期的固定区间分配周数(不使用datetime.week功能),规则如下:
- 1-7日 → 第1周(格式:
1 week) - 8-14日 → 第2周(格式:
2 week) - 15-21日 → 第3周(格式:
3 week) - 22-28日 → 第4周(格式:
4 week) - 29-31日 → 第5周(格式:
5 week)
解决方案
方案一:严格匹配区间规则
通过整数除法直接计算周数,逻辑简洁高效,完全符合区间规则:
import pandas as pd # 构建示例数据 data = { 'date': ['2022-02-06', '2022-02-07', '2022-02-08', '2022-02-15', '2022-02-24', '2022-02-28'], 'other_columns': ['row'] * 6 } df = pd.DataFrame(data) # 将date列转换为datetime类型(若原始数据未转换) df['date'] = pd.to_datetime(df['date']) # 计算周数并格式化 # (day - 1) // 7 实现区间分组:1-7→0,8-14→1,…,29-31→4,加1后得到周数 df['week'] = (df['date'].dt.day - 1) // 7 + 1 df['week'] = df['week'].astype(str) + ' week' print(df)
运行后结果:
| date | other_columns | week |
|---|---|---|
| 2022-02-06 | row | 1 week |
| 2022-02-07 | row | 1 week |
| 2022-02-08 | row | 2 week |
| 2022-02-15 | row | 3 week |
| 2022-02-24 | row | 4 week |
| 2022-02-28 | row | 4 week |
方案二:匹配示例中28日为第5周的情况
若需要将每月28-31日统一归为第5周(与你提供的示例结果一致),可使用pd.cut自定义区间:
import pandas as pd data = { 'date': ['2022-02-06', '2022-02-07', '2022-02-08', '2022-02-15', '2022-02-24', '2022-02-28'], 'other_columns': ['row'] * 6 } df = pd.DataFrame(data) df['date'] = pd.to_datetime(df['date']) # 自定义区间和标签,将28-31日归为第5周 df['week'] = pd.cut( df['date'].dt.day, bins=[0, 7, 14, 21, 28, 31], labels=['1 week', '2 week', '3 week', '4 week', '5 week'], include_lowest=True ) print(df)
运行后结果:
| date | other_columns | week |
|---|---|---|
| 2022-02-06 | row | 1 week |
| 2022-02-07 | row | 1 week |
| 2022-02-08 | row | 2 week |
| 2022-02-15 | row | 3 week |
| 2022-02-24 | row | 4 week |
| 2022-02-28 | row | 5 week |
内容的提问来源于stack exchange,提问作者Carola
相关产品推荐
相关产品推荐

