【问题标题】:Get latest date by comparing multiple date columns in Pandas DataFrame通过比较 Pandas DataFrame 中的多个日期列获取最新日期
【发布时间】:2020-12-04 17:23:33
【问题描述】:

在 DataFrame 中,我有多个 Date 列,如下所示。

+---+----------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+
|   | order_id | dateColumn1 | dateColumn2 | dateColumn3 | dateColumn4 | dateColumn5 | dateColumn6 | dateColumn7 |
+---+----------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+
| 0 | 22161577 | 2019-03-26  |             |             | 2019-03-24  |             | 2019-03-23  | 2019-03-26  |
| 1 | 22719649 | 2019-05-22  |             | 2019-05-21  | 2019-05-28  |             | 2019-05-24  | 2019-05-28  |
| 2 | 23693247 | 2019-08-13  |             | 2019-08-02  | 2019-08-13  |             | 2019-08-10  | 2019-08-07  |
| 3 | 24269635 | 2019-09-23  |             | 2019-10-04  | 2019-09-25  |             | 2019-10-04  |             |
| 4 | 24887829 | 2019-11-12  |             | 2020-11-27  | 2020-11-27  |             | 2020-11-27  |             |
| 5 | 25325867 | 2019-12-19  |             | 2019-12-19  | 2019-12-19  |             | 2019-12-19  |             |
| 6 | 26096549 | 2020-03-18  |             | 2020-06-25  | 2020-04-20  |             | 2020-06-25  | 2020-06-25  |
+---+----------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+

尝试在每行的给定日期中查找最新日期,并将其更新到新列中,如下所示。在少数情况下,dateColumns 2 和 5 也有日期。

+---+----------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+------------+
|   | order_id | dateColumn1 | dateColumn2 | dateColumn3 | dateColumn4 | dateColumn5 | dateColumn6 | dateColumn7 | latestDate |
+---+----------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+------------+
| 0 | 22161577 | 2019-03-26  |             |             | 2019-03-24  |             | 2019-03-23  | 2019-03-26  | 2019-03-26 |
| 1 | 22719649 | 2019-05-22  |             | 2019-05-21  | 2019-05-28  |             | 2019-05-24  | 2019-05-28  | 2019-05-28 |
| 2 | 23693247 | 2019-08-13  |             | 2019-08-02  | 2019-08-13  |             | 2019-08-10  | 2019-08-07  | 2019-08-13 |
| 3 | 24269635 | 2019-09-23  |             | 2019-10-04  | 2019-09-25  |             | 2019-10-04  |             | 2019-10-04 |
| 4 | 24887829 | 2019-11-12  |             | 2020-11-27  | 2020-11-27  |             | 2020-11-27  |             | 2020-11-27 |
| 5 | 25325867 | 2019-12-19  |             | 2019-12-19  | 2019-12-19  |             | 2019-12-19  |             | 2019-12-19 |
| 6 | 26096549 | 2020-03-18  |             | 2020-06-25  | 2020-04-20  |             | 2020-06-25  | 2020-06-25  | 2020-06-25 |
+---+----------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+------------+

我们在 Pandas DataFrame 中是否有任何内置函数来查找最新日期,比较多个日期列。验证此question。然而,寻找替代方法或函数来直接比较多个日期列值并获取最新日期。 DataFrame 包含大约 25K 行。

【问题讨论】:

  • df.filter(like='date').max(axis=1)?

标签: python pandas dataframe date-comparison


【解决方案1】:
df = pd.DataFrame({0: {0: 22161577, 1: 22719649, 2: 23693247, 3: 24269635, 4: 24887829, 5: 25325867, 6: 26096549},
    1: {0: '2019-03-26', 1: '2019-05-22', 2: '2019-08-13', 3: '2019-09-23', 4: '2019-11-12', 5: '2019-12-19', 6: '2020-03-18'},
    2: {0: nan, 1: nan, 2: nan, 3: nan, 4: nan, 5: nan, 6: nan},
    3: {0: nan, 1: '2019-05-21', 2: '2019-08-02', 3: '2019-10-04', 4: '2020-11-27', 5: '2019-12-19', 6: '2020-06-25'},
    4: {0: '2019-03-24', 1: '2019-05-28', 2: '2019-08-13', 3: '2019-09-25', 4: '2020-11-27', 5: '2019-12-19', 6: '2020-04-20'},
    5: {0: nan, 1: nan, 2: nan, 3: nan, 4: nan, 5: nan, 6: nan},
    6: {0: '2019-03-23', 1: '2019-05-24', 2: '2019-08-10', 3: '2019-10-04', 4: '2020-11-27', 5: '2019-12-19', 6: '2020-06-25'},
    7: {0: '2019-03-26', 1: '2019-05-28', 2: '2019-08-07', 3: nan, 4: nan, 5: nan, 6: '2020-06-25'}})
df.columns=["order_id","dateColumn1","dateColumn2","dateColumn3","dateColumn4","dateColumn5","dateColumn6","dateColumn7"]
df[df.filter(regex="date").columns] = df.filter(regex="date").apply(pd.to_datetime)

df:

   order_id dateColumn1 dateColumn2 dateColumn3 dateColumn4 dateColumn5 dateColumn6 dateColumn7
0  22161577  2019-03-26         NaT         NaT  2019-03-24         NaT  2019-03-23  2019-03-26
1  22719649  2019-05-22         NaT  2019-05-21  2019-05-28         NaT  2019-05-24  2019-05-28
2  23693247  2019-08-13         NaT  2019-08-02  2019-08-13         NaT  2019-08-10  2019-08-07
3  24269635  2019-09-23         NaT  2019-10-04  2019-09-25         NaT  2019-10-04         NaT
4  24887829  2019-11-12         NaT  2020-11-27  2020-11-27         NaT  2020-11-27         NaT
5  25325867  2019-12-19         NaT  2019-12-19  2019-12-19         NaT  2019-12-19         NaT
6  26096549  2020-03-18         NaT  2020-06-25  2020-04-20         NaT  2020-06-25  2020-06-25

获取每行的最大日期(仅在日期列中):

df['latest_date'] = df.filter(regex="date").max(1)

df:

   order_id dateColumn1 dateColumn2 dateColumn3 dateColumn4 dateColumn5 dateColumn6 dateColumn7 latest_date
0  22161577  2019-03-26         NaT         NaT  2019-03-24         NaT  2019-03-23  2019-03-26  2019-03-26
1  22719649  2019-05-22         NaT  2019-05-21  2019-05-28         NaT  2019-05-24  2019-05-28  2019-05-28
2  23693247  2019-08-13         NaT  2019-08-02  2019-08-13         NaT  2019-08-10  2019-08-07  2019-08-13
3  24269635  2019-09-23         NaT  2019-10-04  2019-09-25         NaT  2019-10-04         NaT  2019-10-04
4  24887829  2019-11-12         NaT  2020-11-27  2020-11-27         NaT  2020-11-27         NaT  2020-11-27
5  25325867  2019-12-19         NaT  2019-12-19  2019-12-19         NaT  2019-12-19         NaT  2019-12-19
6  26096549  2020-03-18         NaT  2020-06-25  2020-04-20         NaT  2020-06-25  2020-06-25  2020-06-25

【讨论】:

    【解决方案2】:

    以下功能应该服务于目的。

    函数将检查最新日期(按行)并写入新列。

    我在网上查过,有需要的可以去看看, Online Editor.

    import pandas as pd
    import numpy as np
    from datetime import *
    from dateutil.parser import *
    
    def find_lastest_date(dataframe):
        lss = []
        max_date = []
        df = dataframe.astype(str)
        for row in range(len(df)):
            for col in df:
                try:
                    lss.append(parse(str(df.loc[row,col])))
                except:
                    pass
            try:
                max_date.append(max(lss).strftime("%Y/%m/%d %H:%M"))  #change format for output column
            except:
                max_date.append("could not parse date from string")
        else:
            return dataframe.assign(lastest_date = np.array(max_date))
                    
    
    print(find_lastest_date(mydf)) #change mydf to yours
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-06
      • 2021-03-07
      • 1970-01-01
      • 1970-01-01
      • 2013-09-29
      • 1970-01-01
      相关资源
      最近更新 更多