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.