我有两个DataFrame:df1df2

import pandas as pd 

df1 = pd.DataFrame(
    {
        'a': ['2024-01-01 04:00:00', '2023-02-02 20:00:00'],
        'id':['a_1', 'a_2']

    }
)

df2 = pd.DataFrame(
    {
        'a': [
            '2024-01-01 4:00:00', '2024-01-01 05:00:00',
            '2024-01-01 06:00:00', '2024-01-01 07:00:00',
            '2024-01-01 08:00:00', '2024-01-01 09:00:00',
            '2023-02-02 21:00:00', '2023-02-02 23:00:00',
         ]
    }
)

这是预期的输出.我想把iddf1合并到df2:

                    a  id
0 2024-01-01 04:00:00  a_1  
1 2024-01-01 05:00:00  a_1
2 2024-01-01 06:00:00  a_1
3 2024-01-01 07:00:00  a_1
4 2024-01-01 08:00:00  NaN
5 2024-01-01 09:00:00  NaN
6 2023-02-02 21:00:00  a_2
7 2023-02-02 23:00:00  a_2

如果你熟悉烛台,df1.a就是4小时的烛台.例如df1.a.iloc[0]为:

2024-01-01 04:00:00

2024-01-01 05:00:00

2024-01-01 06:00:00

2024-01-01 07:00:00

基本上它的范围是从df1.a.iloc[0]df1.a.iloc[0] + pd.Timedelta(hours=3).我想根据这些身份证覆盖的时间范围对其进行merge次查验.

这是我的try ,但我不知道如何通过日期范围merge:

df1['a'] = pd.to_datetime(df1.a)
df2['a'] = pd.to_datetime(df2.a)
df1['b'] = df1.a + pd.Timedelta(hours=3)

推荐答案

如果我理解正确的话,你需要merge_asof乘以tolerance:

df1['a'] = pd.to_datetime(df1['a'])
df2['a'] = pd.to_datetime(df2['a'])

out = (pd.merge_asof(df2.reset_index().sort_values(by='a'),
                     df1.sort_values(by='a'), on='a',
                     tolerance=pd.Timedelta(hours=3)
                    )
         .set_index('index').reindex(df2.index)
      )

输出:

                    a   id
0 2024-01-01 04:00:00  a_1
1 2024-01-01 05:00:00  a_1
2 2024-01-01 06:00:00  a_1
3 2024-01-01 07:00:00  a_1
4 2024-01-01 08:00:00  NaN
5 2024-01-01 09:00:00  NaN
6 2023-02-02 21:00:00  a_2
7 2023-02-02 23:00:00  a_2

Python相关问答推荐

Tokenizer Docker:无法为Tokenizer构建轮子,这是安装pyproject.toml项目所需的

在Python中添加期货之间的延迟

Python中两个矩阵的自定义Hadamard风格产物

这家einsum运营在做什么?E = NP.einsum(aj,kl-il,A,B)

通过仅导入pandas来在for循环中进行多情节

Python:在类对象内的字典中更改所有键的索引,而不是仅更改一个键

具有多个选项的计数_匹配

由于NEP 50,向uint 8添加-256的代码是否会在numpy 2中失败?

类型错误:输入类型不支持ufuncisnan-在执行Mann-Whitney U测试时[SOLVED]

从dict的列中分钟

Telethon加入私有频道

无法定位元素错误404

如何在python polars中停止otherate(),当使用when()表达式时?

如何从pandas的rame类继承并使用filepath实例化

在两极中过滤

使用Python和文件进行模糊输出

从Windows Python脚本在WSL上运行Linux应用程序

numpy.unique如何消除重复列?

在Admin中显示从ManyToMany通过模型的筛选结果

使用Openpyxl从Excel中的折线图更改图表样式