การจัดรูปแบบวันที่และเวลาของ Python โดยไม่มีการเว้นช่องว่าง


90

มีรูปแบบสำหรับการพิมพ์วันที่และเวลาของ Python ที่จะไม่ใช้ zero-padding ในวันที่และเวลาหรือไม่?

รูปแบบที่ฉันใช้ตอนนี้:

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

ผลลัพธ์: 29/02/2555 05:03 น. ปรารถนา
: 29/2/2555 17:03 น

รูปแบบใดที่จะแสดงเดือนเป็น '2' แทน '02' และเวลาเป็น '17:03 น.' แทน '05: 03PM '

คำตอบ:


77

ตัวเลือกการจัดรูปแบบที่สามารถใช้ได้กับdatetime.strftime()จะใช้แผ่นศูนย์ แน่นอนคุณสามารถหมุนฟังก์ชันการจัดรูปแบบของคุณเองได้ แต่วิธีที่ง่ายที่สุดในกรณีนี้อาจเป็นการโพสต์กระบวนการผลลัพธ์ของdatetime.strftime():

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

1
Sven- เพราะฉันอยากดูเหมือน Facebook ขอบคุณ!
Yarin

4
มีคนจำนวนน้อยมากที่ใช้เวลาเป็นศูนย์ในอเมริกาเหนือเมื่อเขียนเวลาด้วยมือ
Eric Walker

2
สิ่งนี้จะไม่ยังคงเป็นศูนย์ของวันในเดือนหรือไม่?
ผู้พิพากษา Maygarden

1
@JudgeMaygarden: นั่นเป็นเหตุผลว่าทำไมวิธีแก้ปัญหา.lstrip("0")ถึงกำจัดศูนย์ชั้นนำ
Sven Marnach

1
ทำไมฉันถึงต้องการลบแผ่นศูนย์? เนื่องจากสิ่งนี้ผิดโดยRFC 2822ตัวอย่างเช่นในฟีดพอดคาสต์
Vitaly Zdanevich

172

อีกทางเลือกหนึ่งเพื่อหลีกเลี่ยงด้านศูนย์นำหน้า "ทั้งหมดหรือไม่มีเลย" ด้านบนคือการวางเครื่องหมายลบไว้ด้านหน้าประเภทฟิลด์:

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

แล้วนี่: '4/10/2015 03:00 AM'

กลายเป็น: '4/10/2015 03:00 AM'

คุณสามารถเลือกที่จะวางเครื่องหมายลบไว้ข้างหน้าวันได้หากต้องการ

แก้ไข: คุณลักษณะลบมาจากไลบรารี GNU C (“ glibc”) ตามที่กล่าวไว้ในmanpageของLinux strftimeภายใต้“ Glibc notes”


50
คำตอบที่ดี แต่ Linux เท่านั้น จะไม่ทำงานบน Windows stackoverflow.com/questions/10807164/…
ExactaBox

1
ทำไมถึงได้ผล? ฉันไม่พบการอ้างอิงถึงสิ่งนี้ในเอกสารสำหรับdate.__format__or time.strftime, docs.python.org/3/library/…และdocs.python.org/3.8/library/time.html#time.strftimeตามลำดับ
Amin Shah Gilani

95

strftimeสตริงระบบการจัดรูปแบบใหม่ให้เป็นทางเลือก มันค่อนข้างอ่านได้ - จริงๆแล้วมันอาจจะดีกว่าstrftimeในบัญชีนั้น ไม่ต้องพูดถึงความจริงที่ว่ามันไม่ได้เป็นศูนย์:

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

เนื่องจากคุณอาจต้องการให้ช่องว่างเป็นศูนย์ในช่องนาทีคุณสามารถทำได้:

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

หากคุณต้องการเวลา "ปกติ" แทนที่จะเป็นเวลา "ทหาร" คุณยังสามารถใช้ตัวstrftimeระบุมาตรฐานได้เช่นกัน สะดวกสำหรับวัตถุประสงค์ของเราstrftime จะให้รหัสสำหรับเวลา 12 ชั่วโมงที่เติมด้วยช่องว่างแทนที่จะเป็นศูนย์นำหน้า:

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

สิ่งนี้ค่อนข้างอ่านได้น้อยลงอนิจจา และตามที่ @mlissner ชี้ให้เห็นstrftimeจะล้มเหลวในบางแพลตฟอร์ม (ทั้งหมด?) สำหรับวันที่ก่อนปี 1900


1
มีมาตั้งแต่ python 2.6 (มันไม่ได้เป็นที่ใหม่.)
senderle

3
ตัวอย่างเช่นในการสะกดเดือนคุณสามารถใช้สิ่งต่อไปนี้"{0.day} {0:%B %Y}".format(d)ซึ่งจะให้คุณ'2 August 2013'เป็นวันของความคิดเห็นนี้ :)
Jens

2
สิ่งนี้น่าสนใจ แต่ไม่ตอบโจทย์ OP เพราะเขาต้องการชั่วโมง AM / PM ฉันจะไม่ลงคะแนน แต่คำตอบที่ได้รับการยอมรับนั้นถูกต้องหากคุณพยายามจัดรูปแบบวันที่ / เวลาเป็น "อเมริกัน" ใน python
Dana Cartwright

โปรดทราบว่าเทคนิคนี้ใช้ strftime ซึ่งจะล้มเหลวในวันที่ก่อนปี 1900 หากคุณมีวันที่เก่าคุณจะต้องเสียใจกับสิ่งนี้
mlissner

1
เฟค! ฉันเพิ่งรู้ว่าฉันไม่ได้ชี้ d ไปที่วัตถุอื่นฉันแค่ส่งผ่านมันไปเป็นอาร์กิวเมนต์ตำแหน่ง
JacobIRR

54

คำตอบที่ได้รับการยอมรับไม่ใช่วิธีแก้ปัญหาที่เหมาะสม (IMHO)

ใน Linux "#" จะถูกแทนที่ด้วย "-":

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

ใน Windows "-" จะถูกแทนที่ด้วย "#":

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

ที่มา: https://msdn.microsoft.com/en-us/library/fe06s4ak.aspx

ตามที่ระบุไว้โดย Sagneta: เคล็ดลับแฮช # บน Windows มีให้เฉพาะกับไฟล์ปฏิบัติการ python ดั้งเดิมเท่านั้น สิ่งนี้จะใช้ไม่ได้กับการใช้งาน python ที่ใช้ cygwin


3
นี่ถูกต้องแล้ว อย่างไรก็ตามโปรดทราบว่าเคล็ดลับแฮช # บน Windows สามารถใช้ได้กับไฟล์ปฏิบัติการ python ดั้งเดิมเท่านั้น กล่าวอีกนัยหนึ่งสิ่งนี้จะใช้ไม่ได้กับการใช้งาน python ที่ใช้ cygwin
sagneta

2
ว้าวดีมากที่ได้รู้ แต่ฉันตกใจมากกับผลที่ตามมา ฉันกำลังทดสอบการจัดรูปแบบวันที่ที่ส่งคืนจากฐานข้อมูลและฉันจำเป็นต้องผ่านการจัดรูปแบบที่คาดไว้สำหรับการทดสอบแต่ละครั้งและสิ่งนี้จะเพิ่มความซับซ้อนมากมาย
Keith


0

"% l" (นั่นคือ L ตัวพิมพ์เล็ก) ใช้งานได้สำหรับชั่วโมง (แทน "% I") ฉันรู้แค่นี้จากคำตอบอื่นที่นี่

Python strftime - วันที่ไม่มี 0 นำหน้า?

แต่น่าเสียดายที่พวกเขาไม่มีรหัสสำหรับองค์ประกอบอื่น ๆ ของวันที่ / เวลา


pd.to_datetime (dt ['Time'], format = '% l:% M:% S', infer_datetime_format = True) หลังจากลอง% l ยังไม่ได้ผลสำหรับฉันข้อผิดพลาด: - ไฟล์ "pandas_libs \ tslibs \ conversion.pyx" , บรรทัด 399 ใน pandas._libs.tslibs.conversion.convert_datetime_to_tsobject ไฟล์ "pandas_libs \ tslibs \ np_datetime.pyx" บรรทัด 117 ใน pandas._libs.tslibs.np_datetime.check_dts_boundsetime การประทับเวลานาโนวินาทีขอบเขต: 1-01-01 09:15:59
Ankur Tripathi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.