gpt4 book ai didi

python - 根据没有公共(public)列的其他两个日期之间的日期合并两个数据框

转载 作者:太空狗 更新时间:2023-10-29 17:16:51 27 4
gpt4 key购买 nike

我有两个数据框,我需要根据日期值是否适合其他两个日期来合并它们。基本上,我需要执行一个外部联接,其中 B.event_date 位于 A.start_dateA.end_date 之间。似乎 merge 和 join 总是假定一个公共(public)列,在这种情况下,我没有。

    A                           B
start_date end_date event_date price
0 2017-03-27 2017-04-20 0 2017-01-20 100
1 2017-01-10 2017-02-01 1 2017-01-27 200

Result
start_date end_date event_date price
0 2017-03-27 2017-04-20
1 2017-01-10 2017-02-01 2017-01-20 100
2 2017-01-10 2017-02-01 2017-01-27 200

最佳答案

为日期时间创建数据和格式:

df_A = pd.DataFrame({'start_date':['2017-03-27','2017-01-10'],'end_date':['2017-04-20','2017-02-01']})
df_B = pd.DataFrame({'event_date':['2017-01-20','2017-01-27'],'price':[100,200]})

df_A['end_date'] = pd.to_datetime(df_A.end_date)
df_A['start_date'] = pd.to_datetime(df_A.start_date)
df_B['event_date'] = pd.to_datetime(df_B.event_date)

创建键来进行交叉连接:

pandas 1.2.0+ 中的新功能 how='cross' 而不是分配伪键:

df_merge = df_A.merge(df_B, how='cross')

否则,对于 pandas < 1.2.0 使用伪键在“键”上合并

df_A = df_A.assign(key=1)
df_B = df_B.assign(key=1)
df_merge = pd.merge(df_A, df_B, on='key').drop('key',axis=1)

过滤掉不符合开始日期和结束日期之间的事件日期条件的记录:

df_merge = df_merge.query('event_date >= start_date and event_date <= end_date')

加入原始日期范围表并删除键列

df_out = df_A.merge(df_merge, on=['start_date','end_date'], how='left').fillna('').drop('key', axis=1)

print(df_out)

输出:

              end_date           start_date           event_date price
0 2017-04-20 00:00:00 2017-03-27 00:00:00
1 2017-02-01 00:00:00 2017-01-10 00:00:00 2017-01-20 00:00:00 100
2 2017-02-01 00:00:00 2017-01-10 00:00:00 2017-01-27 00:00:00 200

关于python - 根据没有公共(public)列的其他两个日期之间的日期合并两个数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43593554/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com