Sıfır dolgu olmadan Python tarih saat biçimlendirmesi


90

Tarihlerde ve saatlerde sıfır dolgu kullanmayan Python veri zamanlarını yazdırmak için bir format var mı?

Şu anda kullandığım biçim:

mydatetime.strftime('%m/%d/%Y %I:%M%p')

Sonuç: 29.02.2012 05:03
İstenilen: 29.02.2012 17:03

Hangi format ayı "02" yerine "2" ve saati "05: 03PM" yerine "17:03" olarak temsil eder

Yanıtlar:


77

Kullanılabilen biçimlendirme seçeneklerinin datetime.strftime()tümü sıfır tuş takımı olacaktır. Elbette kendi biçimlendirme işlevinizi de döndürebilirsiniz, ancak bu durumda en kolay çözüm aşağıdakilerin sonucunu sonradan işlemek olabilir datetime.strftime():

s = mydatetime.strftime('%m/%d/%Y %I:%M%p').lstrip("0").replace(" 0", " ")

1
Sven- Çünkü Facebook'a benzemek istiyorum. Teşekkürler!
Yarin

4
Kuzey Amerika'da saati elle yazarken çok az insan sıfır dolgulu saatleri kullanır.
Eric Walker

2
Bu hala ayın günü sıfır olmayacak mı?
Hakim Maygarden

1
@JudgeMaygarden: İşte bu yüzden çözüm baştaki .lstrip("0")sıfırdan kurtulmak için var.
Sven Marnach

1
Ped sıfırlarını neden kaldırmak istiyorum? Çünkü bu, örneğin podcast akışında RFC 2822'de yanlıştır .
Vitaly Zdanevich

172

Yukarıdaki "tümü veya hiçbiri" başındaki sıfır yönünden kaçınmanın diğer alternatifi, alan türünün önüne bir eksi yerleştirmektir:

mydatetime.strftime('%-m/%d/%Y %-I:%M%p')

Sonra bu: "10.04.2015 03:00"

Oluyor: '4/10/2015 3:00 AM'

İsterseniz günün önüne isteğe bağlı olarak bir eksi koyabilirsiniz.

Düzenleme: Eksi özelliği, Linux strftime kılavuzunda "Glibc notları" altında belirtildiği gibi GNU C kitaplığından ("glibc") türetilir.


50
Harika yanıt, ancak yalnızca Linux. Windows'ta çalışmayacak. stackoverflow.com/questions/10807164/…
ExactaBox

1
Bu neden işe yarıyor? Ben dokümanlar bu bir referansı bulamıyor date.__format__ya time.strftime, docs.python.org/3/library/... ve docs.python.org/3.8/library/time.html#time.strftime sırasıyla
Amin Şah Gilani

95

Yeni dize biçimlendirme sistemi strftime,. Oldukça okunabilir - aslında, bu nedenle tercih edilebilir strftime. Sıfır yastığı olmadığı gerçeğinden bahsetmiyorum bile:

>>> '{d.month}/{d.day}/{d.year}'.format(d=datetime.datetime.now())
'3/1/2012'

Dakika alanında büyük olasılıkla sıfır doldurma istediğinizden, bunu yapabilirsiniz:

>>> '{d.month}/{d.day}/{d.year} {d.hour}:{d.minute:02}'.format(d=now)
'3/1/2012 20:00'

"Askeri" saat yerine "normal" zaman istiyorsanız, standart strftimebelirleyicileri de kullanabilirsiniz . Elverişli, bizim için, strftime yapar yerine sıfır bir boş ile 12 saatlik zaman yastıklı için bir kod sağlar:

'{d.month}/{d.day}/{d.year} {d:%l}:{d.minute:02}{d:%p}'.format(d=now)
'4/4/2014  6:00PM'

Ne yazık ki, bu biraz daha az okunabilir hale geliyor. Ve @mlissner'ın işaret ettiği gibi,strftime 1900'den önceki tarihler için bazı (tümü?) Platformlarda başarısız olacak.


1
Python 2.6'dan beri var. (O kadar yeni değil .)
senderle

3
Örneğin ayı hecelemek için aşağıdakileri kullanabilirsiniz: "{0.day} {0:%B %Y}".format(d)bu size '2 August 2013'bu yorumun gününü verecektir :)
Jens

2
Bu ilginç, ancak aslında OP'yi yanıtlamıyor çünkü AM / PM saatleri istiyor. Aslında olumsuz oy vermeyeceğim, ancak python'da "Amerikan" tarih / saat biçimlendirmesini almaya çalışıyorsanız, kabul edilen yanıt aslında doğrudur.
Dana Cartwright

Bu tekniğin strftime kullandığını ve 1900'den önceki tarihlerde başarısız olacağını unutmayın. Eski tarihleriniz varsa, buna pişman olacaksınız.
mlissner

1
sahte! D'yi başka bir nesneye işaret etmediğimi yeni fark ettim, onu konumsal bir argüman olarak geçtim.
JacobIRR

54

Kabul edilen cevap uygun bir çözüm değil (IMHO) Belgelenmiş uygun yöntemler:

Linux'ta "#", "-" ile değiştirilir:

% -d,% -H,% -I,% -j,% -m,% -M,% -S,% -U,% -w,% -W,% -y,% -Y

Windows'ta "-", "#" ile değiştirilir:

% # d,% # H,% # I,% # j,% # m,% # M,% # S,% # U,% # w,% # W,% # y,% # Y

#Linux
mydatetime.strftime('%-m/%d/%Y %-I:%M%p')

# Windows
mydatetime.strftime('%#m/%d/%Y %#I:%M%p')

Kaynak: https://msdn.microsoft.com/en-us/library/fe06s4ak.aspx

Sagneta'nın belirttiği gibi: Windows'daki # hash hile yalnızca yerel python çalıştırılabilirinde kullanılabilir. bu cygwin tabanlı python uygulamaları için çalışmayacaktır.


3
Doğru. Bununla birlikte, Windows'daki # hash hilesinin yalnızca yerel python çalıştırılabilirleri tarafından kullanılabileceğini unutmayın. Başka bir deyişle, bu cygwin tabanlı python uygulamaları için işe yaramayacaktır.
sagneta

2
Bunu bilmek harika ama sonuçtan dehşete düştüm. Bir Veritabanından döndürülen tarih biçimlendirmesini test ediyorum ve her test için beklenen biçimlendirmeyi geçmem gerekiyor ve bu tonlarca karmaşıklık katıyor.
Keith

12

Linux'ta Chris Freeman'dan iyi yanıt.

Windows'ta:

mydate.strftime('%#m/%#d/%Y')

Bunun yardımcı olabileceğini düşündüm.


0

"% l" (bu küçük harf L'dir) saat için çalışır ("% I" yerine). Bunu sadece buradaki başka bir cevaptan biliyorum

Python strftime - 0 olmadan tarih?

ancak maalesef bir tarihin / saatin diğer öğeleri için kodlara sahip değiller.


pd.to_datetime (dt ['Time'], format = '% l:% M:% S', infer_datetime_format = True)% l denedikten sonra hala benim için çalışmıyor Hata: - Dosya "pandas_libs \ tslibs \ conversion.pyx" , satır 399, pandas._libs.tslibs.conversion.convert_datetime_to_tsobject Dosyası "pandas_libs \ tslibs \ np_datetime.pyx", satır 117, pandas._libs.tslibs.np_datetime.check_dts_bounds pandas._Bounds.Datetime.check_dts_bounds içinde sınır nanosaniye zaman damgası: 1-01-01 09:15:59
Ankur Tripathi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.