Сортировка столбца (строчного типа) в Pandas DF

Есть датафрейм, в столбце которого указаны дата и время в текстовом формате. Необходимо отсортировать, но обычной командой выполнить это не получится, так как "9:" > "10:". Как, в таком случае, быть? Хотел использовать регулярные выражения, но в них не силен и пока не понимаю, как с помощью них можно сделать.

Пример датафрейма: https://docs.google.com/spreadsheets/d/1uA9G-pOeOJ99SsIBv0gDxCDi8cyaJt9z/edit?usp=sharing&ouid=106691183052162552515&rtpof=true&sd=true


Ответы (1 шт):

Автор решения: strawdog

Ну если хочется прям регулярными выражениями, то, принимая во внимание, что ведущие нули в вашем примере отсутствуют только в часах, дешево и сердито можно сделать так:

df["Date and time"] = df["Date and time"].replace(r'\s(\d)(\D)', r' 0\1\2', regex=True)
df = df.sort_values("Date and time")

df:

                          Date and time
ID                                     
38  29 апреля 2022 г. 07:57:51.002 мсек
39  29 апреля 2022 г. 07:57:52.002 мсек
40  29 апреля 2022 г. 07:57:53.002 мсек
41  29 апреля 2022 г. 07:57:54.002 мсек
42  29 апреля 2022 г. 07:57:55.002 мсек
..                                  ...
33  29 апреля 2022 г. 10:00:13.020 мсек
34  29 апреля 2022 г. 10:00:14.010 мсек
35  29 апреля 2022 г. 10:00:15.010 мсек
36  29 апреля 2022 г. 10:00:16.010 мсек
37  29 апреля 2022 г. 10:00:17.000 мсек

Но вообще, по-хорошему, надо бы сделать парсер даты и времени и преобразовать вашу строку в тип datetime, тогда будет гарантия, что эта колонка при любых обстоятельствах будет сортироваться правильно.
Например:

rumonth = {"января":1, "февраля":2, "марта":3, "апреля":4, "мая":5,
           "июня":6, "июля":7, "августа":8, "сентября":9,
           "октября":10, "ноября":11, "декабря":12}


def dparser(s: str)->str:
    s = (s[:-5]+"000").split()
    s = f"{s[0]} {rumonth[s[1]]} {s[2]} {s[4]}"
    s = pd.to_datetime(s, format="%d %m %Y %H:%M:%S.%f")
    return s

df["Date and time"] = df["Date and time"].apply(dparser)
df = df.sort_values("Date and time")
print(df)
print(df.info())
             Date and time
ID                        
38 2022-04-29 07:57:51.002
39 2022-04-29 07:57:52.002
40 2022-04-29 07:57:53.002
41 2022-04-29 07:57:54.002
42 2022-04-29 07:57:55.002
..                     ...
33 2022-04-29 10:00:13.020
34 2022-04-29 10:00:14.010
35 2022-04-29 10:00:15.010
36 2022-04-29 10:00:16.010
37 2022-04-29 10:00:17.000

[65 rows x 1 columns]
<class 'pandas.core.frame.DataFrame'>
Index: 65 entries, 38 to 37
Data columns (total 1 columns):
 #   Column         Non-Null Count  Dtype         
---  ------         --------------  -----         
 0   Date and time  65 non-null     datetime64[ns]
dtypes: datetime64[ns](1)
memory usage: 1.0 KB
→ Ссылка