Изменить формат даты, который включает текст, используя datetime

#python #python-3.x #pandas #datetime

#python #python-3.x #панды #datetime

Вопрос:

У меня есть pandas df со столбцом дат, где даты записываются как «Понедельник, 19 марта 2001 года в 3:30: 00 по Гринвичу», «Среда, 11 апреля 2001 года в 9:00: 00 по Гринвичу», «Вторник, 3 апреля 2001 года в 2:00:00 вечера по Гринвичу» и так далее.

Я хочу преобразовать его в «19/03/2001», 11/04/2001, 03/04/2001 и так далее. четвертый. Есть ли способ сделать это с помощью datetime?

Комментарии:

1. вы пробовали pd.to_datetime ?

Ответ №1:

 import pandas as pd
  

Если у вас есть фрейм данных:

 df = pd.DataFrame({'Dates':["Monday, March 19, 2001 at 3:30:00pm GMT",
                            "Wednesday, April 11, 2001 at 9:00:00pm GMT",
                            "Tuesday, April 3, 2001 at 2:00:00pm GMT"]})
  

Затем можно сделать:

 import calendar
monthdict={v: k for k,v in enumerate(calendar.month_abbr)}
  

Это создаст monthdict , который будет:

 {'': 0,
 'Apr': 4,
 'Aug': 8,
 'Dec': 12,
 'Feb': 2,
 'Jan': 1,
 'Jul': 7,
 'Jun': 6,
 'Mar': 3,
 'May': 5,
 'Nov': 11,
 'Oct': 10,
 'Sep': 9}
  

Затем извлеките данные месяца из строк в вашем df:

 months=[monthdict[each] for each in df['Dates'].str.split(',').str[1].str.split(' ').str[1].str[:3]]
  

Извлеките дни:

 days=df['Dates'].str.split(',').str[1].str.split(' ').str[2]
  

Годы:

 years=df['Dates'].str.split(',').str[2].str.split(' ').str[1]
  

Верните его в список datetime.datetime объектов:

 dts=[datetime.datetime(int(year), (month), int(day)) for year, month, day in zip(years,  months, days)]
  

Преобразуйте его в df:

 newdf=pd.DataFrame({'NewDates':dts})
  

Если вы хотите преобразовать эти datetime.datetime объекты в строки в каком-либо другом формате, можете сделать:

 newdf['FormattedDates']=newdf['NewDates'].apply(lambda row: repr(row.day) '/' repr(row.month) '/' repr(row.year))
  

В итоге вы получите:

     NewDates    FormattedDates
0   2001-03-19  19/3/2001
1   2001-04-11  11/4/2001
2   2001-04-03  3/4/2001
  

(Я рекомендую использовать datetime.datetime s, а не строки.)

Комментарии:

1. Вполне могут быть более простые способы, чем это.

2. да, вы можете использовать pd.to_datetime метод и указать формат и использовать .dt.strftime поверх объекта pandas datetime для создания косметической даты. не рекомендуется использовать столько итераций в pandas.

Ответ №2:

 from datetime import datetime
def str_to_datetime(s):
    return datetime.strptime(" ".join(s.split()[1:4]), "%B %d, %Y")
  

Комментарии:

1. Спасибо, но это дает «объект ‘Series’ не имеет атрибута ‘split'»

2. Пожалуйста, не публикуйте только код в качестве ответа, но также предоставьте объяснение, что делает ваш код и как он решает проблему вопроса. Ответы с объяснением обычно более полезны и более высокого качества.