比较两个数据框之间的日期列

时间:2020-08-31 15:40:28

标签: python pandas dataframe

我正在处理的项目要求我找出自上次处理以来哪个“项目”已更新。为此,我有两个数据框,每个数据框都包含三列,最后一个是一个日期,该日期表示最后一次更新项目。第一个数据帧来自数据库表上的查询,该查询记录了“项目”的更新日期。第二个是元数据,大约是我上一次应用程序部分处理项目时,我将自己存储在另一个表中。

我想我走得很远,但是我遇到了以下错误,请参见下面提供的代码:

lastmatch = pd.DataFrame({
    'projectid': ['1', '2', '2', '3'],
    'stage': ['c', 'c', 'v', 'v'],
    'lastmatchdate': ['2020-08-31', '2013-11-24', '2013-11-24',
                      '2020-08-31']
})
lastmatch['lastmatchdate'] = pd.to_datetime(lastmatch['lastmatchdate'])

processed = pd.DataFrame({
    'projectid': ['1', '2'],
    'stage': ['c', 'v'],
    'process_date': ['2020-08-30', '2013-11-24']
})
processed['process_date'] = pd.to_datetime(
    processed['process_date']
)

unprocessed = lastmatch[~lastmatch.isin(processed)].dropna()

processed.set_index(['projectid', 'stage'], inplace=True)
lastmatch.set_index(['projectid', 'stage'], inplace=True)

processed.sort_index(inplace=True)
lastmatch.sort_index(inplace=True)

print(lastmatch['lastmatchdate'])
print(processed['process_date'])

to_process = lastmatch.loc[lastmatch['lastmatchdate'] > processed['process_date']]

我要实现的结果是一个数据帧,其中包含“ lastmatchdate”大于上次处理项目的日期(process_date)的行。但是这一行:

to_process = lastmatch.loc[lastmatch['lastmatchdate'] > processed['process_date']]

产生一个ValueError: Can only compare identically-labeled Series objects。我认为这可能是我不知道或弄错的语法。

在这种情况下,我期望的输出是

                lastmatchdate
projectid stage              
1         c        2020-08-31

具体来说,问题是:如何获得一个仅包含另一个数据帧的行的数据帧,该行的(datetime)值的a列大于另一个数据帧的b列。

2 个答案:

答案 0 :(得分:1)

merged = pd.merge(processed, lastmatch, left_index = True, right_index = True)
merged = merged.assign(to_process = merged['lastmatchdate']> merged['process_date'])

您将获得以下信息:

                process_date lastmatchdate  to_process
projectid stage                                       
1         c       2020-08-31    2020-08-31       False
2         v       2013-11-24    2013-11-24       False

答案 1 :(得分:1)

您已经收到ValueError,因为您尝试比较两个不同的数据帧,如果要逐行比较两个数据帧,请在合并之前将它们合并

 lastmatch = pd.DataFrame({
        'projectid': ['1', '2', '2', '3'],
        'stage': ['c', 'c', 'v', 'v'],
        'lastmatchdate': ['2020-08-31', '2013-11-24', '2013-11-24',
                          '2020-08-31']
    })
    lastmatch['lastmatchdate'] = pd.to_datetime(lastmatch['lastmatchdate'])
    
    processed = pd.DataFrame({
        'projectid': ['1', '2'],
        'stage': ['c', 'v'],
        'process_date': ['2020-08-30', '2013-11-24']
    })
    processed['process_date'] = pd.to_datetime(
        processed['process_date']
    )
    
    df=pd.merge(lastmatch,processed,on=['stage','projectid'])
    
    df=df[
        df.lastmatchdate>df.process_date
    ]
    print(df)
      projectid stage lastmatchdate process_date
0         1     c    2020-08-31   2020-08-30