#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. Пожалуйста, не публикуйте только код в качестве ответа, но также предоставьте объяснение, что делает ваш код и как он решает проблему вопроса. Ответы с объяснением обычно более полезны и более высокого качества.