首页 > 解决方案 > 一个df的时间戳在另一个df的2个时间戳之间

问题描述

我有以下2个df:

# -- create a df1 
list_columns = ['time', 'code', 'age']
list_data = [
    ['2019-11-18 10:33:53', 'a1', 10],
    ['2019-11-18 11:33:56', 'a2', 15],
    ['2019-11-18 12:33:58', 'a4', 6],
    ['2019-11-18 13:45:04', 'a5', 3]
    ]
df1 = pd.DataFrame(columns=list_columns, data=list_data)

# -- create a df2
list_columns = ['start_time','end_time','name', 'country']
list_data = [
    ['2019-11-18 10:31:53','2019-11-18 10:35:53' ,'nick', 'germany'],
    ['2019-11-18 11:32:53','2019-11-18 11:35:53', 'joe', 'usa'],
    ['2019-11-18 12:33:58', '2019-11-18 12:35:58','smith', 'california'],
    ['2019-11-18 13:42:04','2019-11-18 13:47:04', 'sam', 'france']
    ]
df1 = pd.DataFrame(columns=list_columns, data=list_data)
df1.head()

不知道在熊猫中是否可能,但如果来自 df1 的时间介于 df2 的start_timeend_time之间,我想在 df1 中添加来自df2的列名称国家/地区。一种连接。

对于日期,我会使用这样的掩码:

mask = (df1['time'] > df2s['start_time]) & (df1['time'] <= df2s['end_time])
df1 = df1.loc[mask]

但在这里我处理的是时间戳,我需要考虑 hh:mm。你能告诉我如何实现我的目标吗?

标签: pythonpandas

解决方案


您的start_timeend_time间隔似乎重叠。你期待多场比赛吗?您可以像这样进行交叉合并:

(df1.assign(tmp=1)
    .merge(df2.assign(tmp=1), on='tmp', how='left')
    .query('start_time <= time <= end_time')
    .drop(['start_time', 'end_time'], axis=1)
)

输出:

                  time code  age  tmp   name     country
0  2019-11-18 10:33:53   a1   10    1   nick     germany
5  2019-11-18 11:33:56   a2   15    1    joe         usa
10 2019-11-18 12:33:58   a4    6    1  smith  california
15 2019-11-18 13:45:04   a5    3    1    sam      france

推荐阅读