熊猫:使用数据框添加周日期

Cha*_*rsi 3 python date python-3.x pandas

我有一个 df like,它有这样的行:

    p_id    m_id    x_id    g_id    u_id
0   2       NaN     1408    7       121
1   3       1259    117     23      315
2   3       1259    221     9       718
3   3       1259    397     76      367
Run Code Online (Sandbox Code Playgroud)

和两个日期时间对象:

开始日期:

datetime.datetime(2021, 5, 25, 0, 0)
Run Code Online (Sandbox Code Playgroud)

结束日期:

datetime.datetime(2021, 5, 29, 0, 0)
Run Code Online (Sandbox Code Playgroud)

我如何得到一个 df ,基本上(添加从 start_date 到 end_date 的每一行的周日期):

    p_id    m_id    x_id    g_id    u_id  s_date
0   2       NaN     1408    7       121   2021-05-25
1   2       NaN     1408    7       121   2021-05-26
2   2       NaN     1408    7       121   2021-05-27
3   2       NaN     1408    7       121   2021-05-28
4   2       NaN     1408    7       121   2021-05-29

5   3       1259    117     23      315   2021-05-25
6   3       1259    117     23      315   2021-05-26
7   3       1259    117     23      315   2021-05-27
8   3       1259    117     23      315   2021-05-28
9   3       1259    117     23      315   2021-05-29
.
.
15  3       1259    397     76      367   2021-05-25
16  3       1259    397     76      367   2021-05-26
17  3       1259    397     76      367   2021-05-27
18  3       1259    397     76      367   2021-05-28
19  3       1259    397     76      367   2021-05-29
Run Code Online (Sandbox Code Playgroud)

Shu*_*rma 5

生成date_range和交叉merge

  1. 在 Pandas 版本 >= 中1.2x,为了执行交叉合并,我们现在可以将一个可选参数传递how='cross'给合并函数
dates = pd.date_range(start_date, end_date)
df.merge(dates.to_series(name='s_date'), how='cross')
Run Code Online (Sandbox Code Playgroud)
  1. 对于 Pandas 版本 <1.2x我们必须创建一个临时合并键来执行cross合并
dates = pd.date_range(start_date, end_date)
df.assign(k=1).merge(dates.to_frame(name='s_date').assign(k=1), on='k').drop('k', 1)
Run Code Online (Sandbox Code Playgroud)
    p_id    m_id  x_id  g_id  u_id     s_date
0      2     NaN  1408     7   121 2021-05-25
1      2     NaN  1408     7   121 2021-05-26
2      2     NaN  1408     7   121 2021-05-27
3      2     NaN  1408     7   121 2021-05-28
4      2     NaN  1408     7   121 2021-05-29
5      3  1259.0   117    23   315 2021-05-25
6      3  1259.0   117    23   315 2021-05-26
7      3  1259.0   117    23   315 2021-05-27
8      3  1259.0   117    23   315 2021-05-28
9      3  1259.0   117    23   315 2021-05-29
10     3  1259.0   221     9   718 2021-05-25
11     3  1259.0   221     9   718 2021-05-26
12     3  1259.0   221     9   718 2021-05-27
13     3  1259.0   221     9   718 2021-05-28
14     3  1259.0   221     9   718 2021-05-29
15     3  1259.0   397    76   367 2021-05-25
16     3  1259.0   397    76   367 2021-05-26
17     3  1259.0   397    76   367 2021-05-27
18     3  1259.0   397    76   367 2021-05-28
19     3  1259.0   397    76   367 2021-05-29
Run Code Online (Sandbox Code Playgroud)