Pythonでゼロ以外の埋め込みタイムスタンプを解析する


83

次のようなタイムスタンプから日時を取得したい:3/1/2014 9:55with datetime.strptime、または同等のもの。

月、日、および時間はゼロで埋められていませんが、これを自動的に解析できるフォーマットディレクティブがここにリストさていないようです。

そうするための最良のアプローチは何ですか?ありがとう!

回答:


130

strptime埋め込まれていない値を解析できます。それらがフォーマットコードテーブルに埋め込まれていると記載されているという事実は、strftimeの出力に適用されます。だからあなたはただ使うことができます

datetime.strptime(datestr, "%m/%d/%Y %H:%M")

8

strptimeisは0が埋め込まれた値を必要としません。以下の例を参照してください

datetime.strptime("3/1/2014 9:55", "%m/%d/%Y %H:%M")
output:   datetime.datetime(2014, 3, 1, 9, 55)

2

この答えが他の誰かを助ける場合に備えて-私はゼロパディングに問題があると思ってここに来ましたが、実際には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

0:12am無効な入力です。する必要があります12:12am11: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を使用する必要があります。
jfs 2015年

おかげで、私が言うように、それは私が制御していないデータソースから来ているので、それが無効な入力であることを認識しています。
hwjp 2015年

1

パターン以外の方法は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)

1

ここで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

1
ネイティブWindowsでは、ダッシュの代わりにハッシュが使用されます:%#d%#m。ただし、ダッシュとハッシュの両方のmodは、文字列のフォーマット(strftime)でのみ必要であり、解析(strptime)では必要ありません。
ヌーノアンドレ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.