我希望是否有人可以幫助我解決這個用例:
我想在兩個日期之間生成日期,然后用周號標記每個日期,然后將新生成的日期和周號作為新列添加到原始資料框并將其映射到用戶 ID。
這是現有的資料框:
| 用戶身份 | start_dt | end_dt |
|---|---|---|
| 1 | 2022-01-01 | 2022-02-01 |
| 2 | 2022-01-14 | 2022-03-14 |
| 3 | 2022-01-05 | 2022-02-05 |
| 4 | 2022-01-25 | 2022-02-25 |
生成開始日期和結束日期之間的日期,并用周數標記日期
| 用戶身份 | 日期 | 周_nbr |
|---|---|---|
| 1 | 2022-01-01 | w1 |
| 1 | 2022-01-02 | w1 |
| 1 | 2022-01-03 | w1 |
| 1 | 2022-01-04 | w1 |
| 1 | 2022-01-05 | w1 |
| 1 | 2022-01-06 | w1 |
| 1 | 2022-01-07 | w1 |
| 1 | 2022-01-08 | w2 |
最后使用 user_id 將生成的 wk 和 dates 映射回原表:
| 用戶身份 | start_dt | end_dt | 日期 | 周_nbr |
|---|---|---|---|---|
| 1 | 2022-01-01 | 2022-02-01 | 2022-01-01 | w1 |
| 1 | 2022-01-01 | 2022-02-01 | 2022-01-02 | w1 |
| 1 | 2022-01-01 | 2022-02-01 | 2022-01-03 | w1 |
| 1 | 2022-01-01 | 2022-02-01 | 2022-01-04 | w1 |
| 1 | 2022-01-01 | 2022-02-01 | 2022-01-05 | w1 |
| 1 | 2022-01-01 | 2022-02-01 | 2022-01-06 | w1 |
| 1 | 2022-01-01 | 2022-02-01 | 2022-01-07 | w1 |
| 1 | 2022-01-01 | 2022-02-01 | 2022-01-08 | w2 |
有什么想法嗎?
uj5u.com熱心網友回復:
我相信這應該給你你正在尋找的東西:
(df.assign(
date = [pd.date_range(i,j) for i,j in zip(df['start_dt'],df['end_dt'])]).explode('date')
.assign(week_nbr = lambda x: x.groupby('user_id')['date']
.diff()
.dt.days
.cumsum()
.floordiv(7)
.add(1,fill_value=0)
.astype(int)
.map('w{}'.format))
.reset_index(drop=True))
輸出:(前 5 行)
user_id start_dt end_dt date week_nbr
0 1 2022-01-01 2022-02-01 2022-01-01 w1
1 1 2022-01-01 2022-02-01 2022-01-02 w1
2 1 2022-01-01 2022-02-01 2022-01-03 w1
3 1 2022-01-01 2022-02-01 2022-01-04 w1
4 1 2022-01-01 2022-02-01 2022-01-05 w1
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/435939.html
