Python strftime-先行0なしの日付?


277

Pythonを使用しているときstrftimeに、日付の最初の0が10日より前の場合、つまり0を削除する方法はありますか。そう01です1か?を見つけることができません%そのためのものがか?

ありがとう!

回答:


568

実際に同じ問題があり、間にハイフンを追加すると %と文字のすると、先行ゼロを削除できることがわかりました。

例えば %Y/%-m/%-d

これはUnix(Linux、OS X)でのみ機能し、Windows(Cygwinを含む)では機能しません。Windowsでは#、たとえばを使用します%Y/%#m/%#d


11
私にとっても機能しない、ValueError(windows、python 2.6)を与える
rocketmonkeys

14
OS Xでは動作しましたが、python.orgのPython 2.7.2を使用しています。
Tim Swast 2013年

13
> -私はこのことについて質問を:-)ここに答えがある@moose stackoverflow.com/questions/28894172/...
マティアス

10
わかりますValueError: '-' is a bad directive in format '%b %-d, %Y'。OSX、Python 2.7。
リチャード

8
%#dWindowsでも同じようになります
dalle

190

この種のことは、formatpython2.6以降のメソッドの登場で実現できます。

>>> import datetime
>>> '{dt.year}/{dt.month}/{dt.day}'.format(dt = datetime.datetime.now())
'2013/4/19'

おそらく元の質問の範囲を超えていますが、より興味深い形式については、次のようなことができます。

>>> '{dt:%A} {dt:%B} {dt.day}, {dt.year}'.format(dt=datetime.datetime.now())
'Wednesday December 3, 2014'

そしてpython3.6以降、これはインライン形式の文字列として表現できます

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'

2
非常に素晴らしい!残念ながらtime.strftime('%A %B %d, %Y')、のようなテキスト表現を使用したい場合、単独では機能しませんTuesday October 07, 2014
PekkaKlärck2014年

@PekkaKlärck-私が今まであなたのコメントに気づかなかった何らかの理由。datetimeは、__format__そのようなものを書くことができる非常に興味深いフックを指定していることがわかります。
mgilson 2014

2
一つの問題は、つまり'{dt.hour}'24時間時計を使用しています:(第二の選択肢はまだ戻って使用することができます使用する。'{%#I}'Windows上および'{%-I}'Unix上で。
ubomb

いい視点ね。私はコードで12時間クロック表現を使用したことがないので、そのようなことは考えていませんでした。
mgilson 2016年

:私は、フォーマット機能で、この追加のドキュメントを見てお勧めしたいpyformat.info
マーク

37

一部のプラットフォームでは、幅との間の高精度仕様サポートすること%による、および(例えば、月の日のための「D」のように)手紙をhttp://docs.python.org/library/time.html -それは間違いなく非ポータブルです解決策(私のMacでは動作しません;-)。多分あなたはそれstrftimeを改善するために後に文字列置換(または本当に厄介なフォーマットのためにRE)を使うことができますか?例えば:

>>> 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'

@guneysusどういう意味ですか?結果は「2000年1月1日」
ユーザー

6
@User上記のコードは、「2000年1月1日」の場合には存在しない0の前の空白スペースをチェックします。
アラガパンラム2013

@alexおそらくご存知のように、この答えは削除してください。正解とはかけ離れています。
CONvid19

29

以下は、strftime()GNU Cライブラリでサポートされている修飾子のドキュメントです。(以前に言ったように、それはポータブルではないかもしれません。)あなたにとって興味深いのは:

  • %e代わりに%d、月の最初のゼロをスペースで置き換えます

私のPython(Linux)で動作します。うまくいくかどうかはわかりません。


3
WindowsのPython 2.6で%eが失敗します。それは* nix固有のものだと思います。
ひど

1
これは、少なくとも* nixシステムでは、最もクリーンで最も一般的なソリューションです。OS X上でこの作品
BFTM

%-d 上記と同様に、これはPython 2.7.2がインストールされたOS X 10.8.5では機能しますが、Python 2.7.3がインストールされたWindows 7 Pro 64ビットでは機能しません。
ヨハン

1
これは、Python 3.5.1がインストールされたWindows 7 SP1で動作しました。
Neil Billingham、2018年

1
これにより、先行ゼロの代わりに余分なスペースが導入されたため、完全一致を探している場合、これはそうではない可能性があります。>>> one = datetime.datetime(2019、5、1、23、28、48、175214)>>> one.strftime( '%b%e%H') 'May 1 23' >>> eleven = datetime .datetime(2019、5、11、23、28、48、175214)>>> eleven.strftime( '%b%e%H') '5月11 23'
hebeha

28
>>> import datetime
>>> d = datetime.datetime.now()
>>> d.strftime('X%d/X%m/%Y').replace('X0','X').replace('X','')
'5/5/2011'

1
これは2000年1月1日に動作しAlexsは動作しません。
guneysus 2013年

行う意味は何.replace('X0','X').replace('X','')ですか?やれ.replace('X0', '')ばいいよ。
Marco Bonelli、2015年

2
@MarcoBonelli:文字列「X12 / X12 / 14」で提案を試してみてください。
gdw2

1
これはハックですが、Pythonのハックです。
Josh M.


18

パーティーにはかなり遅れますが、%-d私の側でうまくいきます。

datetime.now().strftime('%B %-d, %Y') のようなものを生成します 「2014年11月5日」の

乾杯:)


1
主要な回答の複製?stackoverflow.com/a/2073189/389812
gdw2 '10

2
ValueError: Invalid format string私のWindowsシステムで。
徳清

10

Djangoテンプレートの日付フォーマットフィルターはすばやく簡単です。先行ゼロを取り除きます。Djangoモジュールのインポートを気にしない場合は、チェックしてください。

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

あなたが私のようなものであり、djangoでアプリを構築していない場合は、djangoに設定する必要がないことを伝える必要があります。 import django.conf django.conf.settings.configure()
アレックスPretzlav

8

以下を-ご覧ください。

>>> 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)

Python 3で完全に動作します
Saurabh

これは受け入れられる答えになるはずです。求められていることを行います。非常にシンプルで覚えやすいです。ドキュメントをすばやく閲覧したところ、この情報が見つかりませんでした。
Lucas Lima

1
「これは受け入れられる答えであるはずです」。いいえ、できません。これはLinuxでのみ機能するためです。
user136036


3

以下のために%dあなたが使用して整数に変換することができint()、それは自動的に0をリード削除し、整数になります。その後、を使用して文字列に戻すことができますstr()


2
OPの質問は、str()を使用する独自のソリューションではなく、strftimeの呼び出しでフォーマット指定子を使用するソリューションに関するものでした
Dave Hooper

素晴らしい答えです、
デイブ・

3

たとえば、「%-d」の使用は、同じOSの異なるバージョン間でも移植できません。より良い解決策は、日付コンポーネントを個別に抽出し、日付固有のフォーマット演算子と各コンポーネントの日付属性アクセスのどちらかを選択することです。

e = datetime.date(2014, 1, 6)
"{date:%A} {date.day} {date:%B}{date.year}".format(date=e)

2

Pythonは実際にはstrftime(3)プラットフォーム上のC言語関数を呼び出すだけなので、先行ゼロを制御するために使用できるフォーマット文字がある可能性があります。試すman strftimeと見てみましょう。しかし、もちろん、Pythonのマニュアルで説明されているように、結果を移植することはできません。:-)

datetime代わりにt.yearand t.monthやのような属性を持つ新しいスタイルのオブジェクトを使用してみて、先行ゼロの制御をサポートt.dayする通常の強力な%演算子の書式設定にそれらを適用します。詳細については、http://docs.python.org/library/datetime.htmlを参照してください。さらに良い"".format()ことに、Pythonに演算子がある場合は演算子を使用し、さらに最新のものにします。数値の書式オプションもたくさんあります。参照:http : //docs.python.org/library/string.html#string-formatting


2

Alexの方法に基づくと、これは文字列の開始とスペースの後の両方のケースで機能します。

re.sub('^0|(?<= )0', '', "01 January 2000 08:00am")

これは.formatや%-dよりも好きです。これはクロスプラットフォームであり、strftimeを使い続けることができるためです(「11月」や「月曜日」などを取得するため)。


1

古い質問ですが、%l(小文字のL)はstrftimeで機能しました。ただし、Pythonのドキュメントに記載されていないため、これはすべての人には機能しない可能性があります


1
import datetime
now = datetime.datetime.now()
print now.strftime("%b %_d")

これにより、先頭のゼロがスペースに置き換えられます。これは、OPが要求したものとは
Dave Hooper

ValueError: '_' is a bad directive in format '%a %b %_d %H:%M:%S %Y'Python 3.5を使用
ji-ruh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.