Python strroll - дата без провідних 0?


277

При використанні 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, це може бути виражено рядком у форматованому рядком :

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.
Pekka Klärck

@ PekkaKlärck - Я чомусь ще не помітив твого коментаря. Виявляється, datetime визначає дуже цікавий __format__гачок, що дозволяє писати подібні речі.
mgilson

2
Одна проблема полягає в тому, що '{dt.hour}'використовується цілодобовий годинник :(. Використання другого варіанту все одно повертає вас до використання '{%#I}'в Windows та '{%-I}'Unix.
ubomb

Гарна думка. Я ніколи не використовую 12-годинне представлення годинника в коді, тому не думав про цей випадок.
mgilson

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

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 року" немає.
Алагаппан Раму

@alex Будь ласка, видаліть цю відповідь, як ви, напевно, знаєте, це далеко не правильна відповідь.
CONvid19

29

Ось документація модифікаторів, що підтримуються strftime()в бібліотеці GNU C. (Як люди говорили раніше, це може бути не портативно.) Цікавим для вас може бути:

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

Він працює на моєму Python (в Linux). Я не знаю, чи буде це працювати над вашими.


3
% e не працює для мене в Windows w / Python 2.6. Я здогадуюсь, що це * nix. Шкода :(
rocketmonkeys

1
Це найчистіше, найзагальніше рішення - принаймні в системі * nix. Це працює на OS X.
BFTM

Як і %-d вище , це працює в OS X 10.8.5 з Python 2.7.2, але не в 64-розрядному Windows 7 Pro з Python 2.7.3.
Йоган

1
Це працювало для мене на Windows 7 SP1 з Python 3.5.1.
Ніл Біллінгем

1
Це ввело додатковий простір замість нульового нуля, тому якщо ви шукаєте точну відповідність, це може бути не так. >>> one = datetime.datetime (2019, 5, 1, 23, 28, 48, 175214) >>> one.strearch ('% b% e% H') '1 23 травня' >>> одинадцять = datetime .datetime (2019, 5, 11, 23, 28, 48, 175214) >>> одинадцять.послідок ('% 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.
Декінг

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, що вам не потрібно його налаштовувати:import django.conf django.conf.settings.configure()
Alex Pretzlav

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
Saurabh

Це має бути прийнятою відповіддю. Робить те, що просять, дуже просто і легко запам'ятовується. Швидко переглядаючи документи, я не зміг знайти цю інформацію.
Лукас Ліма

1
"Це має бути прийнята відповідь". Ні, це не повинно, оскільки це працює лише в Linux.
користувач136036


3

Оскільки %dви можете конвертувати в ціле число, використовуючи int()тоді, він автоматично видалить провідні 0 і стане цілим числом. Потім можна конвертувати назад у рядок за допомогою str().


2
ОП питання стосувалося вирішення, використовуючи специфікатор формату у виклику до стрипінгу, а не на власне рішення, що стосується str ()
Дейв Хупер

чудова відповідь, не слухайте Дейва
Хупера

3

наприклад, "% -d" не переноситься навіть між різними версіями однієї ОС. Кращим рішенням буде вилучення компонентів дати окремо та вибір між операторами форматування конкретних дат та доступом до атрибутів дати для кожного компонента.

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

2

Оскільки Python насправді просто викликає функцію мови C strftime(3)на вашій платформі, можливо, є символи формату, які можна використовувати для керування початковим нулем; спробуйте 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, тому що це крос-платформа і дозволяє мені продовжувати використовувати стропіл (щоб отримати такі речі, як "Листопад" і "Понеділок").


1

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


1
import datetime
now = datetime.datetime.now()
print now.strftime("%b %_d")

Це замінює провідний нуль пробілом, чого не вимагає ОП
Дейв Хупер

ValueError: '_' is a bad directive in format '%a %b %_d %H:%M:%S %Y'використовуючи python 3.5
ji-ruh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.