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.