Преобразовать строку имени дня недели в дату и время - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть следующая дата (в формате объекта): Tue 31 Jan в серии Панд.

, и я пытаюсь изменить ее на: 31/01/2019

Пожалуйста, как можноЯ достиг этого?Я более или менее понимаю, что pandas.Datetime может легко конвертироваться, когда строковая дата более ясна (например, 6/1/1930 22:00), но не в моем случае, когда это название дня недели.

Спасибо за вашу помощь.

Ответы [ 3 ]

0 голосов
/ 24 декабря 2018

Вот два альтернативных способа достижения одинакового результата.

Метод 1: Использование модуля datetime

from datetime import datetime

datetime_object = datetime.strptime('Tue 31 Jan', '%a %d %b')

print(datetime_object) # outputs 1900-01-31 00:00:00

Если вы указали параметр Year, например Tue 31 Jan 2018, то этот код будет работать.

from datetime import datetime

datetime_object = datetime.strptime('Tue 31 Jan 2018', '%a %d %b %Y')

print(datetime_object) # outputs 2018-01-31 00:00:00

Чтобы напечатать результирующую дату в таком формате, как этот 31/01/2019.Вы можете использовать

print(datetime_object.strftime("%d/%m/%Y")) # outputs 31/01/2018

Здесь - это все возможные параметры форматирования, доступные для объекта datetime.

Метод 2: Использование dateutil.parser

Этот метод автоматически заполняет параметр Year текущим годом.

from dateutil import parser

string = "Tue 31 Jan"

date = parser.parse(string)

print(date) # outputs 2018-01-31 00:00:00
0 голосов
/ 24 декабря 2018

Преобразовать в datetime объект

Если вы хотите использовать модуль datetime, вы можете получить год, выполнив следующие действия:

import datetime as dt

d = dt.datetime.strptime('Tue 31 Jan', '%a %d %b').replace(year=dt.datetime.now().year)

Это займетдата в вашем формате, но надежно заменяет год по умолчанию 1900 на текущий год.

Это похоже на другие ответы, но использует встроенный метод replace, а не объединениестрока.

Вывод

Чтобы получить желаемый вывод из вашего нового объекта datetime, вы можете выполнить следующее:

>>> d.strftime('%d/%m/%Y')
'31/01/2018'
0 голосов
/ 24 декабря 2018

Определите год и позвоните pd.to_datetime в произвольном формате:

s = pd.Series(['Tue 31 Jan', 'Mon 20 Feb',])
pd.to_datetime(s + ' 2019', format='%a %d %b %Y')

0   2019-01-31
1   2019-02-20
dtype: datetime64[ns]

Это нормально, если все даты соответствуют этому формату. Если это не так, это не может быть надежно решено.

Дополнительная информация о форматах даты и времени на strftime.org .


Другой вариант - использовать стороннюю библиотеку dateutil:

import dateutil
s.apply(dateutil.parser.parse)

0   2018-01-31
1   2018-02-20
dtype: datetime64[ns]

Может быть установлен с PyPi.


Другой, более медленный вариант (но болееFlexible) использует стороннюю библиотеку datefinder для поиска дат из строки, содержащей произвольный текст (если это то, что вам нужно):

import datefinder
s.apply(lambda x: next(datefinder.find_dates(x)))

0   2018-01-31
1   2018-02-20
dtype: datetime64[ns]

Вы можете установить ее с помощью PyPi.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...