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!

Solihull
źródło

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.

Ryan
źródło
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'
mgilson
źródło
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'
Alex Martelli
źródło
@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.

newacct
źródło
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'
gdw2
źródło
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.
18

dość późno na imprezę, ale %-ddziała na moim końcu.

datetime.now().strftime('%B %-d, %Y')produkuje coś w stylu „5 listopada 2014 r.”

Twoje zdrowie :)

bonbon.langes
źródło
1
duplikat wiodącej odpowiedzi? stackoverflow.com/a/2073189/389812
gdw2
2
ValueError: Invalid format stringw moim systemie Windows.
Deqing
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')    
Mcqwerty
źródło
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)
ptronico
źródło
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
4

po prostu użyj replacetego:

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

wyświetli:

'2017/7/21'
Mohammad Hossein Shojaeinia
źródło
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().

Nathan Viboonchan
źródło
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)
Chris Chewa
źródło
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 .

Brandon Rhodes
źródło
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”).

mmitchell
źródło
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

OliverRadini
źródło
1
import datetime
now = datetime.datetime.now()
print now.strftime("%b %_d")
użytkownik7503128
źródło
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