ゼロパディングなしのPython日時フォーマット


90

日付と時刻にゼロパディングを使用しないPython日時を印刷するための形式はありますか?

私が現在使用しているフォーマット:

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

結果: 2012年2月29日05:03 PM
希望: 2012年2月29日5:03 PM

月を「02」ではなく「2」として表し、時刻を「05:03 PM」ではなく「5:03 PM」として表す形式はどれですか。

回答:


77

で使用できるフォーマットオプションdatetime.strftime()はすべてゼロパッドになります。もちろん、独自のフォーマット関数をロールすることもできますが、この場合の最も簡単な解決策は、次の結果を後処理することですdatetime.strftime()

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

1
Sven-Facebookのようになりたいから。ありがとう!
yarin 2012年

4
北米では、時間を手書きで書くときにゼロパッドの時間を使用する人はほとんどいません。
エリックウォーカー

2
これはまだその月の日にゼロパッドではありませんか?
メイガーデン裁判官2014

1
@JudgeMaygarden:それが、ソリューションが.lstrip("0")先行ゼロを取り除くために行う理由です。
Sven Marnach 2014

1
パッドゼロを削除したいのはなぜですか?これはRFC2822で間違っているため、たとえばポッドキャストフィードで。
VitalyZdanevich19年

171

上記の「全か無かの」先行ゼロアスペクトを回避するもう1つの方法は、フィールドタイプの前にマイナスを配置することです。

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

次にこれ:「2015年4月10日03:00 AM」

なる: '2015年4月10日3:00 AM'

必要に応じて、オプションでその日の前にマイナスを置くことができます。

編集:マイナス機能は、Linuxのstrftimeのマンページの「Glibcnotes」で説明されているように、GNU Cライブラリ(「glibc」)から派生しています。


50
すばらしい答えですが、Linuxのみです。Windowsでは動作しません。stackoverflow.com/questions/10807164/...
ExactaBox

1
なぜこれが機能するのですか?私はのためのドキュメントで、このへの参照を見つけることができないdate.__format__time.strftimedocs.python.org/3/library/...を、そしてdocs.python.org/3.8/library/time.html#time.strftimeそれぞれ
アミンシャーGilani

93

新しい文字列フォーマットシステムは、の代替手段を提供し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が指摘しているように、strftime1900年より前の日付では、一部の(すべて?)プラットフォームで失敗します。


1
それはpython2.6から出回っています。(そうではありませんという新しい。)
senderle

3
たとえば、月を綴るには、次を使用できます。"{0.day} {0:%B %Y}".format(d)これ'2 August 2013'により、このコメントの日として表示されます:)
Jens

2
これは興味深いですが、彼は午前/午後の時間を望んでいるため、実際にはOPに応答しません。私は実際にそれを否定するつもりはありませんが、Pythonで「アメリカの」日付/時刻のフォーマットを取得しようとしている場合、受け入れられた答えは実際には正しいです。
Dana Cartwright 2014

この手法ではstrftimeを使用することに注意してください。これは、1900年より前の日付では失敗します。古い日付がある場合は、これを後悔します。
mlissner 2016

1
偽物!dを別のオブジェクトに向けていないことに気づき、それを位置引数として渡しました。
JacobIRR

52

受け入れられた回答は適切な解決策ではありません(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実行可能ファイルでのみ使用できます。これは、cygwinベースのPython実装では機能しません。


3
これは正しいです。ただし、Windowsの#ハッシュトリックは、ネイティブのPython実行可能ファイルでのみ使用できることに注意してください。言い換えれば、これはcygwinベースのPython実装では機能しません。
sagneta 2017年

2
これは素晴らしいことですが、私はその結果を恐れています。データベースから返された日付の書式をテストしていますが、各テストで予想される書式を渡す必要があります。これにより、非常に複雑になります。
キース

12

Linux上のChrisFreemanからの良い答え。

Windowsでは、次のようになります。

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

それが役立つかもしれないと思った。


0

「%l」(小文字のL)は、(「%I」の代わりに)1時間機能します。私はここで別の答えからこれを知っているだけです

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_bounds pandas._libs.tslibs.np_境界ナノ秒のタイムスタンプ:1-01-01午前9時15分59秒
はAnkur Tripathi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.