Python strftime - дата без начального 0?


278

При использовании Python strftimeесть ли способ удалить первые 0 даты, если она до 10-го числа, т.е. так 01есть 1? Не можете найти %вещь для этого?

Спасибо!

Ответы:


568

На самом деле у меня была та же проблема, и я понял, что, если вы добавите дефис между %буквой и, вы можете удалить начальный ноль.

Например %Y/%-m/%-d.

Это работает только в Unix (Linux, OS X), но не в Windows (включая Cygwin). В Windows вы бы использовали #, например %Y/%#m/%#d.


11
У меня даже не работает, выдает ValueError (windows, python 2.6)
— rocketmonkeys

14
У меня это работало на OS X, но я использую Python 2.7.2 с python.org.
— Тим Суаст

13
@moose Я задал вопрос по этому поводу :-) вот ответ -> stackoverflow.com/questions/28894172/…
— Матиас

10
Я получаю ValueError: '-' is a bad directive in format '%b %-d, %Y'. OSX, Python 2.7.
— Ричард

8
%#dбудет делать то же самое на Windows
— Dalle

190

Мы можем сделать это с появлением formatметода начиная с python2.6:

>>> import datetime
>>> '{dt.year}/{dt.month}/{dt.day}'.format(dt = datetime.datetime.now())
'2013/4/19'

Хотя, возможно, за рамками исходного вопроса, для более интересных форматов вы можете сделать что-то вроде:

>>> '{dt:%A} {dt:%B} {dt.day}, {dt.year}'.format(dt=datetime.datetime.now())
'Wednesday December 3, 2014'

Начиная с python3.6, это можно выразить в виде строки в формате inline :

Python 3.6.0a2 (v3.6.0a2:378893423552, Jun 13 2016, 14:44:21) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> dt = datetime.datetime.now()
>>> f'{dt:%A} {dt:%B} {dt.day}, {dt.year}'
'Monday August 29, 2016'

2
Очень хорошо! К сожалению, не работает в одиночку, если вы хотите использовать текстовое представление вроде time.strftime('%A %B %d, %Y'), которое дает (теперь, на английском языке) Tuesday October 07, 2014.
— Пекка Кларк

@ PekkaKlärck - Почему-то я не заметил твой комментарий до сих пор. Оказывается, datetime определяет очень интересный __format__хук, который позволяет вам писать такие вещи.
— Мгилсон

2
Одна из проблем заключается в том, что '{dt.hour}'используются 24-часовые часы :(. Использование второго параметра все еще возвращает вас к использованию '{%#I}'в Windows и '{%-I}'Unix.
— ubomb

Хорошая точка зрения. Я никогда не использовал 12-часовое представление часов в коде, поэтому я не думал об этом случае.
— Мгилсон

Я бы посоветовал взглянуть на эту дополнительную документацию по функциональности формата: pyformat.info
— Mark

37

Некоторые платформы могут поддерживать спецификацию ширины и точности между %буквой и буквой (например, «d» для дня месяца), согласно http://docs.python.org/library/time.html - но это определенно непереносимый решение (например, не работает на моем Mac ;-). Может быть, вы можете использовать замену строки (или RE, для действительно неприятного формата) после того, strftimeкак исправить это? например:

>>> y
(2009, 5, 7, 17, 17, 17, 3, 127, 1)
>>> time.strftime('%Y %m %d', y)
'2009 05 07'
>>> time.strftime('%Y %m %d', y).replace(' 0', ' ')
'2009 5 7'

@guneysus что ты имеешь ввиду? Это должно привести к «1 января 2000»
— пользователь

6
@User Приведенный выше код проверяет наличие пробела до 0, который в случае «01 января 2000» отсутствует.
— Alagappan Ramu

@alex Пожалуйста, удалите этот ответ, поскольку вы, вероятно, знаете, он далек от правильного ответа.
— CONvid19

29

Вот документация по модификаторам, поддерживаемым strftime()в библиотеке GNU C. (Как уже говорили ранее, он может быть не переносимым.) Вас могут заинтересовать:

  • %eвместо %dбудет заменять ведущий ноль в дне месяца на пробел

Это работает на моем Python (на Linux). Я не знаю, будет ли это работать на вашем.


3
Мне не удается% e на Windows с Python 2.6. Я предполагаю, что это * nix специфично. Жаль :(
— ракета monkeys

1
Это самое чистое, самое общее решение - по крайней мере в системе * nix. Это работает на OS X.
— BFTM

Как и %-d выше , это работает в OS X 10.8.5 с Python 2.7.2, но не в Windows 7 Pro 64-bit с Python 2.7.3.
— Йохан

1
Это работало для меня на Windows 7 SP1 с Python 3.5.1.
— Нил Биллингем

1
Это привело к появлению дополнительного пробела вместо начального нуля, поэтому, если вы ищете точное совпадение, это может быть не так. >>> one = datetime.datetime (2019, 5, 1, 23, 28, 48, 175214) >>> one.strftime ('% b% e% H') '1 мая 23' >>> eleven = datetime .datetime (2019, 5, 11, 23, 28, 48, 175214) >>> eleven.strftime ('% b% e% H')
— '11

28
>>> import datetime
>>> d = datetime.datetime.now()
>>> d.strftime('X%d/X%m/%Y').replace('X0','X').replace('X','')
'5/5/2011'

1
Это работает 01 января 2000 года, Алекс не работает.
— guneysus

Какой смысл делать .replace('X0','X').replace('X','')? Просто сделай, .replace('X0', '')и это будет хорошо.
— Марко Бонелли

2
@MarcoBonelli: попробуйте свои предложения в строке «X12 / X12 / 14», и вы увидите.
— gdw2

1
Это хак, но это пиктонный хак.
— Джош М.


18

довольно поздно на вечеринку, но %-d работает на моем конце.

datetime.now().strftime('%B %-d, %Y') производит что-то вроде "5 ноября 2014"

ура :)


1
дубликат ведущего ответа? stackoverflow.com/a/2073189/389812
— gdw2

2
ValueError: Invalid format stringв моей системе Windows.
— Deqing

10

Я считаю фильтр форматирования даты в шаблоне Django быстрым и простым. Он удаляет ведущие нули. Если вы не против импортировать модуль Django, проверьте его.

http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date

from django.template.defaultfilters import date as django_date_filter
print django_date_filter(mydate, 'P, D M j, Y')    

Обратите внимание, что если вы похожи на меня и не создаете свое приложение в django, вам нужно будет сказать django, что вам не нужно его настраивать:import django.conf django.conf.settings.configure()
— Алекс Прецлав

8

Посмотрите на -ниже:

>>> from datetime import datetime
>>> datetime.now().strftime('%d-%b-%Y')
>>> '08-Oct-2011'
>>> datetime.now().strftime('%-d-%b-%Y')
>>> '8-Oct-2011'
>>> today = datetime.date.today()
>>> today.strftime('%d-%b-%Y')
>>> print(today)

Работает отлично в Python 3
— Саурабх

Это должен быть принятый ответ. Делает то, что спрашивают, супер просто и легко запомнить. Быстро просматривая документы, я не смог найти эту информацию.
— Лукас Лима

1
«Это должен быть принятый ответ». Нет, не должен, так как это работает только в Linux.
— user136036


3

Поскольку %dвы можете преобразовать в целое число, используя int()это, он автоматически удалит ведущий 0 и станет целым числом Затем вы можете преобразовать обратно в строку, используя str().


2
ОП вопрос был о решении с использованием спецификатора формата при вызове strftime, а не о решении по собственному усмотрению, включающем str ()
— Дейв Хупер

отличный ответ, не слушайте Дэйва Хупера
— Тоскан

3

например, использование «% -d» не переносимо даже между разными версиями одной и той же ОС. Лучшим решением было бы извлекать компоненты даты по отдельности и выбирать между операторами форматирования для конкретной даты и доступом к атрибутам даты для каждого компонента.

e = datetime.date(2014, 1, 6)
"{date:%A} {date.day} {date:%B}{date.year}".format(date=e)

2

Поскольку Python действительно просто вызывает strftime(3)функцию языка C на вашей платформе, возможно, существуют символы формата, которые вы можете использовать для управления лидирующим нулем; попробуйте man strftimeпосмотреть. Но, конечно, результат не будет переносимым, как вам напомнит руководство по Python. :-)

Я хотел бы попробовать использовать новый стиль datetimeобъекта вместо этого, который имеет атрибуты , как t.yearи t.monthи t.day, и положите их через нормальный, мощный форматирование %оператора, который делает управление поддержки ведущих нулей. См. Http://docs.python.org/library/datetime.html для получения подробной информации. Еще лучше, используйте "".format()оператор, если ваш Python имеет его, и будьте еще более современными; у этого есть много вариантов формата для чисел также. Смотрите: http://docs.python.org/library/string.html#string-formatting .


2

Основанный на методе Алекса, это будет работать как для случаев начала строки, так и для пробелов:

re.sub('^0|(?<= )0', '', "01 January 2000 08:00am")

Мне нравится это лучше, чем .format или% -d, потому что это кроссплатформенный и позволяет мне продолжать использовать strftime (чтобы получить такие вещи, как «ноябрь» и «понедельник»).


1

Старый вопрос, но% l (в нижнем регистре L) работал для меня в strftime: это может не работать для всех, хотя, поскольку это не указано в документации по Python, которую я нашел


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.