【问题标题】:Merging dataframes by closest earlier date by group按组按最接近的较早日期合并数据框
【发布时间】:2018-10-13 22:17:30
【问题描述】:

我有两个由以下代码生成的数据框:

import datetime 


def random_date(start, minutesList):
    current = start
    l = len(minutesList)
    out_ = []
    for min_ in minutesList:
        curr = current + datetime.timedelta(minutes=min_)
        out_.append(curr.strftime("%d/%m/%y %H:%M") )

    return(out_)



startDate = datetime.datetime(2013, 9, 20,13,00)

minutesListUsages = [2, 5, 6, 35, 38, 45, 57]                                            
minutesListLogins = [0, 1, 1.5, 3, 5.5, 24, 37, 37.5, 39.5, 45, 48, 53, 59, 60]

df_logins1 = pd.DataFrame([random_date(startDate,minutesListLogins),
                          [1] * len(random_date(startDate,minutesListLogins))]).transpose()
df_logins1.columns = ['date', 'id']
df_logins1

df_logins2 = pd.DataFrame([random_date(startDate,minutesListLogins),
                          [2] * len(random_date(startDate,minutesListLogins))]).transpose()
df_logins2.columns = ['date', 'id']
df_logins2

df_logins = df_logins1.append(df_logins2)

# Usages
df_usages1 = pd.DataFrame([random_date(startDate,minutesListUsages),
                          [1] * len(random_date(startDate,minutesListUsages))]).transpose()
df_usages1.columns = ['date', 'id']
df_usages1

df_usages2 = pd.DataFrame([random_date(startDate,minutesListUsages),
                          [2] * len(random_date(startDate,minutesListUsages))]).transpose()
df_usages2.columns = ['date', 'id']
df_usages2

df_usages = df_usages1.append(df_usages2)

我想在df_logins 中指出哪个登录与df_usage 的使用相关联。我想通过id 来做这件事。我说如果登录是最接近的,但早于给定使用的登录,则它与使用相关联。

根据此定义,我如何识别导致id 使用的登录。

谢谢

【问题讨论】:

    标签: python pandas datetime merge pandas-groupby


    【解决方案1】:

    您可以将merge_asofbyon 参数一起使用

    df_usages.date=pd.to_datetime(df_usages.date)
    df_logins.date=pd.to_datetime(df_logins.date)
    df_usages,df_logins=df_usages.sort_values('date').rename(columns={'date':'use_date'}),df_logins.sort_values('date').rename(columns={'date':'log_date'})
    pd.merge_asof(df_usages,df_logins,left_on='use_date',right_on='log_date',by='id',direction = 'nearest')
    Out[168]: 
                  use_date id            log_date
    0  2013-09-20 13:02:00  1 2013-09-20 13:01:00
    1  2013-09-20 13:02:00  2 2013-09-20 13:01:00
    2  2013-09-20 13:05:00  1 2013-09-20 13:05:00
    3  2013-09-20 13:05:00  2 2013-09-20 13:05:00
    4  2013-09-20 13:06:00  1 2013-09-20 13:05:00
    5  2013-09-20 13:06:00  2 2013-09-20 13:05:00
    6  2013-09-20 13:35:00  1 2013-09-20 13:37:00
    7  2013-09-20 13:35:00  2 2013-09-20 13:37:00
    8  2013-09-20 13:38:00  1 2013-09-20 13:37:00
    9  2013-09-20 13:38:00  2 2013-09-20 13:37:00
    10 2013-09-20 13:45:00  1 2013-09-20 13:45:00
    11 2013-09-20 13:45:00  2 2013-09-20 13:45:00
    12 2013-09-20 13:57:00  1 2013-09-20 13:59:00
    13 2013-09-20 13:57:00  2 2013-09-20 13:59:00
    

    【讨论】:

    • 嗨,谢谢。我想您可以通过设置direction = backwards 来确保登录早于使用?他们是您选择nearest 的具体原因吗?
    • @clog14 根据你的话如果它是最接近的
    • 你好文,但我也写了“predates”。 ;-)。要获得提前日期,我只需要做:direction = backwards,对吗?
    • @clog14 是的,您可以将其更改为向后或只是不传递方向,导致默认为向后
    猜你喜欢
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 2021-12-13
    相关资源
    最近更新 更多