Вопрос или проблема
Преобразовать список строк времени в уникальный формат строки
У меня есть список строк времени с разными форматами, как показано ниже
time = ["1:5 am", "1:35 am", "8:1 am", "9:14 am", "14:23 pm", "20:2 pm"]
dict = {'time': time}
df = pd.DataFrame(dict)
и я хотел бы заменить строки в списке, как показано ниже.
["01:05 am", "01:35 am", "08:01 am", "09:14 am", "14:23 pm", "20:02 pm"]
Не уверен, как написать регулярное выражение, которое отформатирует строки в DataFrame.
Возможное решение, основанное на регулярных выражениях.
(df['time'].str.replace(r'^(\d):', r'0\1:', regex=True)
.str.replace(r':(\d)\s', r':0\1 ', regex=True))
Основные идеи:
-
С помощью
r'^(\d):'
совпадает одна цифра в начале строки, за которой следует двоеточие (например, 1: в 1:5 am). -
С помощью
r'0\1:'
добавляется 0 перед захваченной цифрой и сохраняется двоеточие. -
С помощью
r':(\d)\s'
совпадает одна цифра после двоеточия и перед пробелом (например, :5 в 1:5 am). -
С помощью
r':0\1 '
добавляется 0 перед захваченной цифрой и сохраняются двоеточие и пробел.
Вывод:
0 01:05 am
1 01:35 am
2 08:01 am
3 09:14 am
4 14:23 pm
5 20:02 pm
Name: time, dtype: object
Вы можете использовать pd.to_datetime
+ Series.dt.strftime
+ Series.str.lower
:
import pandas as pd
time = ["1:5 am", "1:35 am", "8:1 am",
"9:14 am", "14:23 pm", "20:2 pm"]
# предполагая, что автор имел в виду запятую между "9:14 am" и "14:23 pm"
data = {'time': time}
df = pd.DataFrame(data)
df['time_corrected'] = (pd.to_datetime(df['time'], format="%H:%M %p")
.dt.strftime('%H:%M %p')
.str.lower()
)
Вывод:
time time_corrected
0 1:5 am 01:05 am
1 1:35 am 01:35 am
2 8:1 am 08:01 am
3 9:14 am 09:14 am
4 14:23 pm 14:23 pm
5 20:2 pm 20:02 pm
Если вам просто нужен список, вы можете сделать:
time_corrected = (pd.to_datetime(time, format="%H:%M %p")
.strftime('%H:%M %p')
.str.lower()
.tolist()
)
Вывод:
['01:05 am', '01:35 am', '08:01 am', '09:14 am', '14:23 pm', '20:02 pm']
Что касается кодов формата (например, '%H:%M %p'
), смотрите здесь.
Вы можете разделить каждое время, как показано в этом ответе (https://stackoverflow.com/a/33536592/724039), отформатировать его и снова соединить:
import pandas as pd
time = ["1:5 am", "1:35 am", "8:1 am", "9:14 am", "14:23 pm", "20:2 pm"]
dict = {'time': time}
df = pd.DataFrame(dict)
my_list = []
for t in time:
s = ""
a = ":"
for k in [j for i in t.split(':') for j in i.split(' ')]:
m = ("00"+k)[-2:] if k.isnumeric() else k
s = s + m + a
a = " "
#print(s)
my_list.append(s)
dict = {'time': my_list}
print(dict)
Р.S. Я не разработчик на python, поэтому думаю, что, возможно, есть способ написать это умнее…
Ответ или решение
Конечно! Давайте решим задачу по преобразованию списка временных строк в единый формат с помощью Python и библиотеки Pandas. Ниже представлено несколько способов достижения желаемого результата с подробными объяснениями.
Задача
У нас есть список временных строк в различных форматах:
time = ["1:5 am", "1:35 am", "8:1 am", "9:14 am", "14:23 pm", "20:2 pm"]
И мы хотим преобразовать этот список в следующий формат:
["01:05 am", "01:35 am", "08:01 am", "09:14 am", "14:23 pm", "20:02 pm"]
Решение
- Импорт необходимых библиотек:
import pandas as pd
-
Создание DataFrame:
Давайте создадим DataFrame из нашего списка временных строк.
time = ["1:5 am", "1:35 am", "8:1 am", "9:14 am", "14:23 pm", "20:2 pm"]
data = {'time': time}
df = pd.DataFrame(data)
-
Преобразование временных строк:
Мы можем использовать метод
pd.to_datetime()
для преобразования строк в даты, затем отформатировать эти даты с помощьюstrftime()
.
df['time_corrected'] = (pd.to_datetime(df['time'], format="%I:%M %p")
.dt.strftime('%H:%M %p')
.str.lower()
)
-
Вывод результата:
Теперь у нас есть откорректированный столбец:
print(df['time_corrected'])
Вывод:
0 01:05 am
1 01:35 am
2 08:01 am
3 09:14 am
4 14:23 pm
5 20:02 pm
Name: time_corrected, dtype: object
-
Получение списка:
Если вы хотите получить результат в виде простого списка, вы можете сделать это следующим образом:
time_corrected_list = (pd.to_datetime(time, format="%I:%M %p")
.strftime('%H:%M %p')
.str.lower()
.tolist()
)
print(time_corrected_list)
Вывод:
['01:05 am', '01:35 am', '08:01 am', '09:14 am', '14:23 pm', '20:02 pm']
Объяснение
- В методе
pd.to_datetime()
мы используем формат"%I:%M %p"
, где%I
обозначает часы (в 12-часовом формате),%M
– минуты, а%p
– меридиан (AM/PM). - С помощью
strftime('%H:%M %p')
мы преобразуем даты обратно в строки, но в формате, который мы хотим.%H
используется для 24-часового формата, что позволяет нам получить двузначные часы. - Наконец,
str.lower()
приводит строки к нижнему регистру.
Данный метод обеспечивает правильное преобразование временных строк в единый формат, используя возможности Pandas и работу с датами в Python.