Сортировка столбца (строчного типа) в Pandas DF
Есть датафрейм, в столбце которого указаны дата и время в текстовом формате. Необходимо отсортировать, но обычной командой выполнить это не получится, так как "9:" > "10:". Как, в таком случае, быть? Хотел использовать регулярные выражения, но в них не силен и пока не понимаю, как с помощью них можно сделать.
Пример датафрейма: https://docs.google.com/spreadsheets/d/1uA9G-pOeOJ99SsIBv0gDxCDi8cyaJt9z/edit?usp=sharing&ouid=106691183052162552515&rtpof=true&sd=true
Ответы (1 шт):
Ну если хочется прям регулярными выражениями, то, принимая во внимание, что ведущие нули в вашем примере отсутствуют только в часах, дешево и сердито можно сделать так:
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