Python strftime - data bez wiodącego 0?


277

Podczas używania Pythona strftimeistnieje sposób na usunięcie pierwszego 0 daty, jeśli jest ona wcześniejsza niż 10, tj. tak 01jest 1? Nie możesz znaleźć %czegoś takiego?

Dzięki!

Odpowiedzi:


568

Właściwie miałem ten sam problem i zdałem sobie sprawę, że jeśli dodasz łącznik między %literą a literą, możesz usunąć wiodące zero.

Na przykład %Y/%-m/%-d.

Działa to tylko w systemach Unix (Linux, OS X), a nie Windows (w tym Cygwin). W systemie Windows użyłbyś #np %Y/%#m/%#d.


11
Nawet nie działa dla mnie, daje ValueError (Windows, Python 2.6)
RocketMonkeys

14
Działa to dla mnie na OS X, ale używam Python 2.7.2 z python.org.
Tim Swast,

13
@moose Zadałem pytanie na ten temat :-) Oto odpowiedź -> stackoverflow.com/questions/28894172/...
Mathias

10
I dostać ValueError: '-' is a bad directive in format '%b %-d, %Y'. OSX, Python 2.7.
Richard,

8
%#dzrobiłby to samo na Windowsie
dal

190

Możemy to zrobić dzięki pojawieniu się tej formatmetody od python2.6:

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

Chociaż być może poza zakresem oryginalnego pytania, w celu uzyskania bardziej interesujących formatów możesz robić rzeczy takie jak:

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

Od wersji Python3.6 można to wyrazić jako ciąg sformatowany w wierszu :

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
Bardzo dobrze! Niestety nie działa sam, jeśli chcesz użyć reprezentacji tekstowej, takiej jak time.strftime('%A %B %d, %Y'), która daje (teraz w języku angielskim) Tuesday October 07, 2014.
Pekka Klärck

@ PekkaKlärck - Z jakiegoś powodu nie zauważyłem twojego komentarza do tej pory. Okazuje się, że datetime określa bardzo interesujący __format__haczyk, który pozwala pisać takie rzeczy.
mgilson

2
Jednym z problemów jest to, że '{dt.hour}'używa zegara 24-godzinnego :(. Użycie drugiej opcji wciąż powoduje powrót do korzystania '{%#I}'z systemu Windows i '{%-I}'Uniksa.
Ubomb

Słuszna uwaga. Nigdy nie używam 12-godzinnych reprezentacji zegara w kodzie, więc nie pomyślałem o tej sprawie.
mgilson

Proponuję przejrzeć dodatkową dokumentację dotyczącą funkcji formatu: pyformat.info
Mark

37

Niektóre platformy mogą obsługiwać specyfikację szerokości i precyzji między %literą a literą (np. „D” na dzień miesiąca), zgodnie z http://docs.python.org/library/time.html - ale zdecydowanie nie jest przenośny rozwiązanie (np. nie działa na moim komputerze Mac ;-). Może możesz użyć zamiany ciągu (lub RE, dla naprawdę paskudnego formatu) po tym, strftimeaby temu zaradzić? na przykład:

>>> 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 co masz na myśli? Powinno to spowodować „1 stycznia 2000 r.”
Użytkownik

6
@ Użytkownik Powyższy kod sprawdza puste miejsce przed 0, które w przypadku „01 stycznia 2000” nie jest obecne.
Alagappan Ramu

@alex Usuń tę odpowiedź, jak zapewne wiesz, jest daleka od poprawnej odpowiedzi.
CONvid19

29

Oto dokumentacja modyfikatorów obsługiwanych przez strftime()bibliotekę GNU C. (Jak ludzie mówili wcześniej, może nie być przenośny). Interesujące może być:

  • %ezamiast %dzastąpi wiodące zero w dniu miesiąca spacją

Działa na moim Pythonie (w systemie Linux). Nie wiem, czy to zadziała na twoim.


3
% e kończy się niepowodzeniem w systemie Windows z Python 2.6. Zgaduję, że to jest * specyficzne dla Nix. Szkoda :(
rocketmonkeys

1
To najczystsze, najbardziej ogólne rozwiązanie - przynajmniej w systemie * nix. Działa to w systemie OS X.
BFTM

Podobnie jak %-d powyżej , działa to w OS X 10.8.5 z Python 2.7.2, ale nie w Windows 7 Pro 64-bit z Python 2.7.3.
Johan

1
Działa to dla mnie na Windows 7 SP1 z Python 3.5.1.
Neil Billingham,

1
To wprowadziło dodatkową spację zamiast wiodącego zera, więc jeśli szukasz dokładnego dopasowania, to może nie być to. >>> one = datetime.datetime (2019, 5, 1, 23, 28, 48, 175214) >>> one.strftime ('% b% e% H') '1 23 maja >>> jedenaście = datetime .datetime (2019, 5, 11, 23, 28, 48, 175214) >>> jedenaście. 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
Działa to 01 stycznia 2000, Alexs nie działa.
guneysus

Po co to robić .replace('X0','X').replace('X','')? Po prostu zrób .replace('X0', '')i będzie dobrze.
Marco Bonelli,

2
@MarcoBonelli: Wypróbuj swoją sugestię dotyczącą ciągu „X12 / X12 / 14”, a zobaczysz.
gdw2

1
To jest hack, ale jest to hack pythonowy.
Josh M.



10

Uważam, że filtr formatowania daty szablonu Django jest szybki i łatwy. Usuwa początkowe zera. Jeśli nie masz nic przeciwko importowaniu modułu Django, sprawdź to.

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')    

Pamiętaj, że jeśli jesteś podobny do mnie i nie import django.conf django.conf.settings.configure()
budujesz

8

Spójrz na -poniższe:

>>> 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)

Działa doskonale w python 3
Saurabh

To powinna być zaakceptowana odpowiedź. Czy to, o co prosisz, super proste i łatwe do zapamiętania. Przeglądając szybko dokumenty, nie mogłem znaleźć tych informacji.
Lucas Lima,

1
„To powinna być zaakceptowana odpowiedź”. Nie, nie powinno, ponieważ działa to tylko w systemie Linux.
user136036


3

Aby %dprzekonwertować na liczbę całkowitą za pomocą, int()wówczas automatycznie usunie początkowe 0 i stanie się liczbą całkowitą. Następnie możesz przekonwertować z powrotem na ciąg za pomocą str().


2
Pytanie OP dotyczyło rozwiązania wykorzystującego specyfikator formatu w wywołaniu strftime, a nie samodzielnego rozwiązania wykorzystującego str ()
Dave Hooper

świetna odpowiedź, nie słuchaj Dave'a Hoopera
Toskan

3

użycie na przykład „% -d” nie jest przenośne nawet między różnymi wersjami tego samego systemu operacyjnego. Lepszym rozwiązaniem byłoby wyodrębnienie komponentów daty indywidualnie i wybranie pomiędzy operatorami formatowania specyficznymi dla daty a dostępem do atrybutu daty dla każdego komponentu.

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

2

Ponieważ Python tak naprawdę wywołuje funkcję języka C strftime(3)na twojej platformie, być może istnieją znaki formatu, których możesz użyć do kontrolowania wiodącego zera; próbowaćman strftime spojrzeć. Ale oczywiście wynik nie będzie przenośny, jak przypomni Ci instrukcja Python. :-)

Chciałbym spróbować użyć nowego stylu datetimeobiekt zamiast, który posiada atrybuty, jak t.yeari t.monthi t.dayi włożył ci poprzez normalne, high-powered formatowania z %operatorem, który obejmuje kontrolą pomocy wiodących zer. Szczegółowe informacje można znaleźć na stronie http://docs.python.org/library/datetime.html . Jeszcze lepiej, użyj "".format()operatora, jeśli Twój Python go ma i jest jeszcze bardziej nowoczesny; ma również wiele opcji formatowania liczb. Zobacz: http://docs.python.org/library/string.html#string-formatting .


2

W oparciu o metodę Alexa będzie to działać zarówno w przypadku ciągów początkowych, jak i późniejszych:

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

Podoba mi się to lepiej niż .format lub% -d, ponieważ jest to platforma wieloplatformowa i pozwala mi nadal używać strftime (aby uzyskać takie rzeczy jak „listopad” i „poniedziałek”).


1

Stare pytanie, ale% l (małe litery L) działało dla mnie w strftime: może to nie działać dla wszystkich, ponieważ nie jest wymienione w dokumentacji Pythona, którą znalazłem


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

Zastępuje to wiodące zero spacją, co nie jest tym, o co poprosił PO
Dave Hooper

ValueError: '_' is a bad directive in format '%a %b %_d %H:%M:%S %Y'using python 3.5
ji-ruh
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.