2017-09-22 11 views
1

datetime libraryを使用してISO 8601の書式設定された日付文字列が異なるタイプがあります。これらの文字列からdatetime objectを取得します。Python ISO 8601日時解析

入力文字列の例:

  1. 2017-08-01(2017年8月1日)
  2. 2017-09(2017年の9月)
  3. 2017-W20(20週)
  4. 2017-W37-2(第37週の火曜日)

私は第1、第2、第4エキスを得ることができましたmples。しかし、3回目は、試している間にトレースバックを取得する。次のように私は、ブロック-以外の試みを彼らのためにdatetime.datetime.strptime機能を使用しています

try : 
    d1 = datetime.datetime.strptime(date,'%Y-%m-%d') 
except : 
    try : 
     d1 = datetime.datetime.strptime(date,'%Y-%m') 
    except : 
     try : 
      d1 = datetime.datetime.strptime(date,'%G-W%V') 
     except : 
      print('Not going through') 

私は、端末上の第三tryブロックを試したときには、ここで私は

>>> dstr 
'2017-W38' 
>>> dt.strptime(dstr,'%G-W%V') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Users\tushar.aggarwal\Desktop\Python\Python3632\lib\_strptime.py", line 565, in _strptime_datetime 
    tt, fraction = _strptime(data_string, format) 
    File "C:\Users\tushar.aggarwal\Desktop\Python\Python3632\lib\_strptime.py", line 483, in _strptime 
    raise ValueError("ISO year directive '%G' must be used with " 
ValueError: ISO year directive '%G' must be used with the ISO week directive '%V' and a weekday directive ('%A', '%a', '%w', or '%u'). 
を得たエラーです

そして、これは私が第四ケースの作業を得た方法である:ここでは

>>> dstr 
'2017-W38-2' 
>>> dt.strptime(dstr,'%G-W%V-%u') 
datetime.datetime(2017, 9, 19, 0, 0) 

は参照です私のコードのために:strptime documentation

はSO ISO 8601形式から解析した日付についての多くの質問がありますが、私は私の問題に対処するものを見つけることができませんでした。さらに、関連する質問は非常に古いもので、%G%Vの指示文がstrptimeに存在しないPythonの古いバージョンを使用しています。

+1

'datetime'の解析には制限があります。モジュール 'dateutil'を見てください。 – BoarGules

答えて

0

pendulumライブラリはこれらのライブラリでうまく機能します。

>>> import pendulum 
>>> pendulum.parse('2017-08-01') 
<Pendulum [2017-08-01T00:00:00+00:00]> 
>>> pendulum.parse('2017-09') 
<Pendulum [2017-09-01T00:00:00+00:00]> 
>>> pendulum.parse('2017-W20') 
<Pendulum [2017-05-15T00:00:00+00:00]> 
>>> pendulum.parse('2017-W37-2') 
<Pendulum [2017-09-12T00:00:00+00:00]> 

私はリンクであなたを参照してきたためにページが言う、「ライブラリはネイティブRFC 3339形式、ほとんどのISO 8601のフォーマットおよび他のいくつかの一般的な形式をサポートしています。非標準の文字列やより複雑な文字列を渡すと、ライブラリはdateutilパーサーにフォールバックします。 '

+0

振り子オブジェクトを取得した後(解析後)、この振り子オブジェクトから 'datetime'オブジェクトを取得できますか? –

+0

振り子がdatetimeから継承するため、これを行う必要はありません。それはドロップインの代替品です。かなり制限されたカテゴリのsitutations(https://pendulum.eustace.io/faq/を参照)を除いて、あなたは振り子で行うことができるdatetimeで何かをすることができます。 datetimeの代わりに振り子をインポートするだけです。インスタンスをdatetimeに変換する場合は、adate.year、adate.month、adate.dayなどの1つ以上のプロパティを使用します。しかし、これはほとんど常に不必要です。 –

関連する問題