Получите последнюю дату, сравнив несколько столбцов даты в Pandas DataFrame

В 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  |
+---+----------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+

Попытка найти самую последнюю дату среди заданных дат в каждой строке и обновить ее в новом столбце, как показано ниже. В некоторых случаях столбцы dateColumn 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 для поиска последней даты, сравнивая несколько столбцов даты. Проверено на этот вопрос. Тем не менее, поиск альтернативного метода или функции для прямого сравнения нескольких значений столбца даты и получения самой последней даты. DataFrame содержит примерно 25 тыс. строк.


person PraveenKS    schedule 04.12.2020    source источник


Ответы (2)


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
person Amir saleem    schedule 04.12.2020

следующая функция должна служить цели.

функция проверит даты (по строкам) для последней и запишет в новый столбец.

я проверил это в Интернете, посетите, если нужно, онлайн-редактор.

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
person ahmedul_Kabir_Omi    schedule 05.12.2020