У меня есть строка типа 23 July 1914, и я хочу преобразовать ее в формат даты 23/07/1914. Но мой код дает error.

from datetime import datetime
datetime_object = datetime.strptime('1 June 2005','%d %m %Y')
print datetime_object
-1
Rohit-Pandey 29 Авг 2017 в 13:18

5 ответов

Лучший ответ

Ваша ошибка в формате, который вы используете для удаления вашей строки. Вы используете %m в качестве спецификатора формата для месяца, но при этом ожидается заполненное целым числом 0, представляющее месяц года (например, 06 для вашего примера). То, что вы хотите использовать, это %B, который ожидает, что месяц года будет записан полностью (например, June в вашем примере).

Для полного объяснения спецификаторов формата datetime, пожалуйста, обратитесь к Документация, и если у вас есть какие-либо другие проблемы, пожалуйста, проверьте сначала там.

7
Jake Conkerton-Darby 29 Авг 2017 в 10:27

Вот что вы должны делать:

from datetime import datetime
datetime_object = datetime.strptime('1 June 2005','%d %B %Y')
s = datetime_object.strftime("%d/%m/%y")
print(s)

Выход:

>>> 01/06/05

Вы видите, что ваш strptime требует двух параметров.

strptime(string[, format])

И строка будет преобразована в datetime объект в соответствии с указанным вами форматом.

Есть разные форматы

% a - сокращенное название дня недели% A - полное название дня недели% b - сокращенное название месяца% B - полное название месяца% c - предпочтительное представление даты и времени% C - номер столетия (год, разделенный на 100, диапазон от 00 до 99)% d - день месяца (от 01 до 31)% D - аналогично% m /% d /% y% e - день месяца (от 1 до 31)% g - как% G, но без столетия% G - 4-значный год, соответствующий номеру недели ISO (см.% V). % h - так же, как% b% H - час, с использованием 24-часовых часов (от 00 до 23)

Выше приведены некоторые примеры. Ознакомьтесь здесь с форматами.

Внимательно посмотрите на этих двоих!

% b - сокращенное название месяца% B - полное название месяца

Это должно быть похоже на строку, которую вы предоставляете. Запутанно взглянем на эти примеры.

>>> datetime.strptime('1 jul 2009','%d %b %Y')
datetime.datetime(2009, 7, 1, 0, 0)
>>> datetime.strptime('1 Jul 2009','%d %b %Y')
datetime.datetime(2009, 7, 1, 0, 0)
>>> datetime.strptime('jul 21 1996','%b %d %Y')
datetime.datetime(1996, 7, 21, 0, 0)

Как вы можете видеть на основе формата, строка превращается в объект datetime. Теперь посмотри!

>>> datetime.strptime('1 July 2009','%d %b %Y')
Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
    datetime.strptime('1 July 2009','%d %b %Y')
  File "/usr/lib/python3.5/_strptime.py", line 510, in _strptime_datetime
    tt, fraction = _strptime(data_string, format)
  File "/usr/lib/python3.5/_strptime.py", line 343, in _strptime
    (data_string, format))
ValueError: time data '1 July 2009' does not match format '%d %b %Y'

Почему ошибка, потому что jun или Jun (краткая форма) означает %b. Когда вы предоставляете June, это запутывается. Что теперь делать? Изменил формат.

>>> datetime.strptime('1 July 2009','%d %B %Y')
datetime.datetime(2009, 7, 1, 0, 0)

Простое преобразование объекта datetime достаточно просто.

>>> s = datetime.strptime('1 July 2009','%d %B %Y')
>>> s.strftime('%d/%m/%Y')
'01/07/2009

И снова %m - это формат для отображения его в месяцах (числах), подробнее о них.

2
void 29 Авг 2017 в 10:51

%d означает «День месяца как десятичное число с добавлением нуля».

%m означает «Месяц как десятичное число с добавлением нуля».

Ни день, ни месяц не дают того, что вы скажете. То, что вам нужно, %B на месяц (только если вы используете en_US), а %-d на день.

0
Honza Zíka 29 Авг 2017 в 10:29

Это должно работать:

from datetime import datetime
print(datetime.strptime('1 June 2005', '%d %B %Y').strftime('%d/%m/%Y'))
print(datetime.strptime('23 July 1914', '%d %B %Y').strftime('%d/%m/%Y'))

Для получения дополнительной информации вы можете прочитать о strftime-strptime-поведения

0
BPL 29 Авг 2017 в 10:28

заполнитель для "Месяц" в качестве полного названия локали. " будет %B, а не %m:

>>> from datetime import datetime
>>> datetime_object = datetime.strptime('1 June 2005','%d %B %Y')
>>> print(datetime_object)
2005-06-01 00:00:00

>>> print(datetime_object.strftime("%d/%m/%Y"))
01/06/2005
0
MSeifert 29 Авг 2017 в 10:28