簡體   English   中英

比較兩個數據框之間的日期列

[英]Comparing date columns between two dataframes

我正在處理的項目要求我找出自上次處理以來哪個“項目”已更新。 為此,我有兩個數據框,它們都包含三列,最后一列是表示上次更新項目的日期。 第一個數據框來自對記錄“項目”更新日期的數據庫表的查詢。 第二個是元數據,我將自己存儲在不同的表中,關於我的應用程序部分處理項目的最后一次。

我想我已經走了很遠,但我遇到了以下錯誤,請參閱下面提供的代碼:

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

所以具體的問題是:如何獲得僅包含另一個數據幀的行的數據幀,該數據幀的列 a 的(日期時間)值大於另一個數據幀的 b 列。

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

您收到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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM