次のようなタイムスタンプから日時を取得したい:3/1/2014 9:55with 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,%-mPython 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/%dvs.%d/%m)したりできます。月の場合はあいまいな場合があります。たとえば、2015/10/12「10月12日」または「12月10日」ですか。ところで、入力形式に合わせる%Y/%m/%d代わりに%m/%d/%Yを使用する必要があります。