根据日期将数据框中的值分配给另一个数据框中的新列

assign values from a dataframe to a new column in another datafraem base on date

我有一个数据框,上面有日期,我每月重新采样一次

**(T1)**
    date_gr         p
0  2017-03  24122.818182
1  2017-04  29696.000000
2  2017-05  37135.500000
3  2017-06  42871.555556
4  2017-07  46941.600000
5  2017-08  46963.750000
6  2017-09  40710.714286
7  2017-10  31212.200000
8  2017-11  28834.750000
9  2017-12  29319.666667
10 2018-01  28833.250000
11 2018-02  29657.800000
12 2018-03  28773.071429
13 2018-04  30049.142857
14 2018-05  34283.750000
15 2018-06  43694.222222
16 2018-07  51136.500000
17 2018-08  45297.250000
18 2018-09  39780.833333
19 2018-10  32073.600000
20 2018-11  28176.000000
21 2018-12  28315.250000
22 2019-01  28213.500000
23 2019-02  28886.500000
24 2019-03  26971.428571
25 2019-04  27644.875000
26 2019-05  38581.500000
27 2019-06  46501.857143
28 2019-07  50121.333333
29 2019-08  48226.250000
30 2019-09  42919.800000
31 2019-10  34589.571429
32 2019-11  29877.000000
33 2019-12  30223.000000
34 2020-01  30932.666667
35 2020-02  31630.800000
36 2020-03  27894.000000
37 2020-04  29523.000000
38 2020-05  40462.400000
39 2020-06  50798.428571
40 2020-07  51814.200000
41 2020-08  48111.714286
42 2020-09  46026.750000
43 2020-10  35544.000000

现在我需要创建一个新列并将上面看到的每个月值分配给它,基于 month.I 意思是如果值是 2019-10 的,新列的所有值都是 2019-10十月 1 日到 31 日。

例如我们有:

   **(T2)**
        date_gr       p_ins
    0  2019-10-01  2122.818182
    1  2019-10-02  2696.000000
    2  2019-10-03  3135.500000
    3  2019-10-04  4871.555556
    4  2019-10-05  4941.600000
    5  2019-10-06  4963.750000
    6  2019-10-07  4710.714286
    7  2019-10-08  3212.200000
    8  2019-10-09  2834.750000
    9  2019-10-10  2319.666667
    10 2019-10-11  2833.250000
    11 2019-10-12  2657.800000
    12 2019-10-13  2773.071429
    13 2019-10-14  3049.142857
    14 2019-10-15  3283.750000
    15 2019-10-16  4694.222222
    16 2019-10-17  5136.500000
    17 2019-10-18  4297.250000
    18 2019-10-19  3780.833333
    19 2019-10-20  3073.600000
    20 2019-11-01  2176.000000
    21 2019-11-02  2315.250000
    22 2019-11-03  2213.500000
    23 2019-11-04  2886.500000
    24 2019-11-05  2971.428571
    25 2019-11-06  2644.875000
    26 2019-11-07  3581.500000
    27 2019-11-08  4501.857143
    28 2019-11-09  5121.333333
    29 2019-11-10  4226.250000
    30 2019-11-11  4919.800000
    31 2019-11-12  3589.571429
    32 2019-11-13  2877.000000
    33 2019-11-14  3223.000000
    34 2019-11-15  3932.666667
    35 2019-11-16  3630.800000
    36 2019-11-17  2894.000000
    37 2019-11-18  2523.000000
    38 2019-11-19  4462.400000
    39 2019-11-20  5798.428571

我们需要在 (T2) 中找到与 (T1) 的月份相匹配的月份值,并将其值分配给其中的每一天 month.We 必须对每个月和每一天执行此操作。

output:

            date_gr       p_ins          p
        0  2019-10-01  2122.818182  34589.571429
        1  2019-10-02  2696.000000  34589.571429
        2  2019-10-03  3135.500000  34589.571429
        3  2019-10-04  4871.555556  34589.571429
        4  2019-10-05  4941.600000  34589.571429
        5  2019-10-06  4963.750000  34589.571429
        6  2019-10-07  4710.714286  34589.571429
        7  2019-10-08  3212.200000  34589.571429
        8  2019-10-09  2834.750000  34589.571429
        9  2019-10-10  2319.666667  34589.571429
        10 2019-10-11  2833.250000  34589.571429
        11 2019-10-12  2657.800000  34589.571429
        12 2019-10-13  2773.071429  34589.571429
        13 2019-10-14  3049.142857  34589.571429
        14 2019-10-15  3283.750000  34589.571429
        15 2019-10-16  4694.222222  34589.571429
        16 2019-10-17  5136.500000  34589.571429
        17 2019-10-18  4297.250000  34589.571429
        18 2019-10-19  3780.833333  34589.571429
        19 2019-10-20  3073.600000  34589.571429
        20 2019-11-01  2176.000000  29877.000000
        21 2019-11-02  2315.250000  29877.000000
        22 2019-11-03  2213.500000  29877.000000
        23 2019-11-04  2886.500000  29877.000000
        24 2019-11-05  2971.428571  29877.000000
        25 2019-11-06  2644.875000  29877.000000
        26 2019-11-07  3581.500000  29877.000000
        27 2019-11-08  4501.857143  29877.000000
        28 2019-11-09  5121.333333  29877.000000
        29 2019-11-10  4226.250000  29877.000000
        30 2019-11-11  4919.800000  29877.000000
        31 2019-11-12  3589.571429  29877.000000
        32 2019-11-13  2877.000000  29877.000000
        33 2019-11-14  3223.000000  29877.000000
        34 2019-11-15  3932.666667  29877.000000
        35 2019-11-16  3630.800000  29877.000000
        36 2019-11-17  2894.000000  29877.000000
        37 2019-11-18  2523.000000  29877.000000
        38 2019-11-19  4462.400000  29877.000000
        39 2019-11-20  5798.428571  29877.000000

我如何在 pandas 中做到这一点?预先感谢您的帮助。

有几种方法。您可以做的一件事是获取每月数据并将每个日期转换为月初。然后就可以使用merge_asof将两个数据框join起来了。

# Add day one to each monthly value
t1.date_gr = t1.date_gr + '-01'

# Convert to datetime objects
t1.date_gr = pd.to_datetime(t1.date_gr)
t2.date_gr = pd.to_datetime(t2.date_gr)

# merge t2 to closest previous date in t1
pd.merge_asof(t2, t1, on='date_gr', direction='backward')

输出

      date_gr        p_ins             p
0  2019-10-01  2122.818182  34589.571429
1  2019-10-02  2696.000000  34589.571429
2  2019-10-03  3135.500000  34589.571429
3  2019-10-04  4871.555556  34589.571429
4  2019-10-05  4941.600000  34589.571429
5  2019-10-06  4963.750000  34589.571429
6  2019-10-07  4710.714286  34589.571429
7  2019-10-08  3212.200000  34589.571429
8  2019-10-09  2834.750000  34589.571429
9  2019-10-10  2319.666667  34589.571429
10 2019-10-11  2833.250000  34589.571429
11 2019-10-12  2657.800000  34589.571429
12 2019-10-13  2773.071429  34589.571429
13 2019-10-14  3049.142857  34589.571429
14 2019-10-15  3283.750000  34589.571429
15 2019-10-16  4694.222222  34589.571429
16 2019-10-17  5136.500000  34589.571429
17 2019-10-18  4297.250000  34589.571429
18 2019-10-19  3780.833333  34589.571429
19 2019-10-20  3073.600000  34589.571429
20 2019-11-01  2176.000000  29877.000000
21 2019-11-02  2315.250000  29877.000000
22 2019-11-03  2213.500000  29877.000000
23 2019-11-04  2886.500000  29877.000000
24 2019-11-05  2971.428571  29877.000000
25 2019-11-06  2644.875000  29877.000000
26 2019-11-07  3581.500000  29877.000000
27 2019-11-08  4501.857143  29877.000000
28 2019-11-09  5121.333333  29877.000000
29 2019-11-10  4226.250000  29877.000000
30 2019-11-11  4919.800000  29877.000000
31 2019-11-12  3589.571429  29877.000000
32 2019-11-13  2877.000000  29877.000000
33 2019-11-14  3223.000000  29877.000000
34 2019-11-15  3932.666667  29877.000000
35 2019-11-16  3630.800000  29877.000000
36 2019-11-17  2894.000000  29877.000000
37 2019-11-18  2523.000000  29877.000000
38 2019-11-19  4462.400000  29877.000000
39 2019-11-20  5798.428571  29877.000000