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'
mgilson
источник
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). Я не знаю, будет ли это работать на вашем.

newacct
источник
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'
gdw2
источник
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"

ура :)

bonbon.langes
источник
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')    
mcqwerty
источник
Обратите внимание, что если вы похожи на меня и не создаете свое приложение в 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)
ptronico
источник
Работает отлично в Python 3
Саурабх
Это должен быть принятый ответ. Делает то, что спрашивают, супер просто и легко запомнить. Быстро просматривая документы, я не смог найти эту информацию.
Лукас Лима
1
«Это должен быть принятый ответ». Нет, не должен, так как это работает только в Linux.
user136036
4

просто используйте replaceтак:

(datetime.date.now()).strftime("%Y/%m/%d").replace("/0", "/")

это выведет:

'2017/7/21'
Мохаммад Хоссейн Шоджейния
источник
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 (чтобы получить такие вещи, как «ноябрь» и «понедельник»).

mmitchell
источник
1

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

OliverRadini
источник
1
import datetime
now = datetime.datetime.now()
print now.strftime("%b %_d")
user7503128
источник
Это заменяет
Дейв Хупер
ValueError: '_' is a bad directive in format '%a %b %_d %H:%M:%S %Y'использование python 3.5
джи-рух