次のようなタイムスタンプから日時を取得したい:3/1/2014 9:55
with datetime.strptime
、または同等のもの。
月、日、および時間はゼロで埋められていませんが、これを自動的に解析できるフォーマットディレクティブがここにリストされていないようです。
そうするための最良のアプローチは何ですか?ありがとう!
回答:
この答えが他の誰かを助ける場合に備えて-私はゼロパディングに問題があると思ってここに来ましたが、実際には12:00対00:00と%I
フォーマッターに関係していました。
%I
フォーマッタは、必要に応じてゼロ詰め、12時間クロックの時間と一致することを意味します。ただし、データソースによっては、真夜中または正午が実際にはゼロであるというデータが表示される場合があります。例:
>>> datetime.strptime('2015/01/01 0:12am', "%Y/%m/%d %I:%M%p")
ValueError: time data '2015/01/01 0:12am' does not match format '%Y/%m/%d %I:%M'
どのようなstrptime
実際に望んでいたことは12、いないゼロでした。
>>> datetime.strptime('2015/01/01 12:12am', "%Y/%m/%d %I:%M%p")
datetime.datetime(2015, 1, 1, 0, 12)
ただし、データソースを常に管理しているわけではありません。このエッジケースの私の解決策は、例外をキャッチし、それをで解析してみて%H
、私たちがいると思うエッジケースにいることをすばやく確認することでした。
def get_datetime(string):
try:
timestamp = datetime.strptime(string, "%m/%d/%Y %I:%M%p")
except ValueError:
# someone used zero for midnight?
timestamp = datetime.strptime(string, "%m/%d/%Y %H:%M%p")
assert string.lower().endswith('am')
assert timestamp.hour == 0
return timestamp
パターン以外の方法はdateutil.parse
モジュールを使用することです。現在何を使用しているかわからない場合でも、一般的な日付形式を解析できます。
例:
>>> import dateutil.parser
>>>
>>> utc_time = '2014-08-13T00:00:00'
>>> verbose_time = '13-Aug-2014'
>>> some_locale = '3/1/2014 9:55'
>>> dateutil.parser.parse(utc_time)
datetime.datetime(2014, 8, 13, 0, 0)
>>> dateutil.parser.parse(verbose_time)
datetime.datetime(2014, 8, 13, 0, 0)
>>> dateutil.parser.parse(some_locale)
datetime.datetime(2014, 3, 1, 9, 55)
ここでstrftimeドキュメントを見ることができますが、実際には、すべてのプラットフォームですべてがうまく機能しているわけではありません。たとえば、%-d,%-m
Python 2.7のwin7では機能しないため、次のように実行できます。
>>> date_str = '{d.year}-{d.month}-{d.day}'.format(d=datetime.datetime.now())
>>> print(date_str)
2016-5-23
%#d
、%#m
。ただし、ダッシュとハッシュの両方のmodは、文字列のフォーマット(strftime
)でのみ必要であり、解析(strptime
)では必要ありません。
0:12am
無効な入力です。する必要があります12:12am
。11:59 pm
の後に、12:00 am
ではなく、が続き0:00am
ます。間違った時間形式でデータを提供するには、さまざまな方法があります。たとえば、入力%y
で4桁の年()ではなく2桁の年(%Y
)を使用したり、日/月を入れ替えたり(%m/%d
vs.%d/%m
)したりできます。月の場合はあいまいな場合があります。たとえば、2015/10/12
「10月12日」または「12月10日」ですか。ところで、入力形式に合わせる%Y/%m/%d
代わりに%m/%d/%Y
を使用する必要があります。