Преобразовать список строк времени в уникальный формат строки

Вопрос или проблема

Преобразовать список строк времени в уникальный формат строки

У меня есть список строк времени с разными форматами, как показано ниже

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"]

Решение

  1. Импорт необходимых библиотек:
import pandas as pd
  1. Создание 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)
  1. Преобразование временных строк:

    Мы можем использовать метод pd.to_datetime() для преобразования строк в даты, затем отформатировать эти даты с помощью strftime().

df['time_corrected'] = (pd.to_datetime(df['time'], format="%I:%M %p")
                        .dt.strftime('%H:%M %p')
                        .str.lower()
                        )
  1. Вывод результата:

    Теперь у нас есть откорректированный столбец:

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
  1. Получение списка:

    Если вы хотите получить результат в виде простого списка, вы можете сделать это следующим образом:

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.

Оцените материал
Добавить комментарий

Капча загружается...