523

「2009-05-28T16:15:00」のような形式の日時文字列を取得しています (これは ISO 8601 だと思います)。ハック的なオプションtime.strptimeの 1 つは、タプルの最初の 6 つの要素を使用して文字列を解析し、次のように日時コンストラクターに渡すことです。

datetime.datetime(*time.strptime("2007-03-04T21:08:12", "%Y-%m-%dT%H:%M:%S")[:6])

これを行う「よりクリーンな」方法を見つけることができませんでした。ありますか?

4

11 に答える 11

819

私は、タイムゾーンの処理と一般的に堅実な日付の解析にdateutilライブラリを使用することを好みます。ISO 8601次のような文字列を取得した2010-05-08T23:41:54.000Z場合、特にタイムゾーンが含まれているかどうかを前もって知らなかった場合は、strptime でそれを解析するのが楽しいでしょう。pyiso8601には、使用中に遭遇したいくつかの問題 (トラッカーを確認してください) があり、数年間更新されていません。対照的に、dateutil はアクティブであり、私にとってはうまくいきました。

from dateutil import parser
yourdate = parser.parse(datestring)
于 2010-10-11T17:03:29.307 に答える
185

Python 3.7 および外部ライブラリがないため、datetime モジュールのstrptime 関数を使用できます。

datetime.datetime.strptime('2019-01-04T16:41:24+0200', "%Y-%m-%dT%H:%M:%S%z")

その他のフォーマット オプションについては、こちらを参照してください。

Python 2 はフォーマット指定子をサポートしていないため、%z可能であればどこでも明示的に Zulu 時間を使用することをお勧めします。

datetime.datetime.strptime("2007-03-04T21:08:12Z", "%Y-%m-%dT%H:%M:%SZ")
于 2009-06-09T10:45:59.767 に答える
18

タイムゾーン情報に注意する必要があります。これは、tz を認識しない日付時刻と tz を認識する日付時刻を比較するときに問題が発生する可能性があるためです。

それが役に立たない理由が本当にわかっていない限り、(たとえ UTC としてだけであっても) 常に tz 対応にするのがおそらく最善です。

#-----------------------------------------------
import datetime
import pytz
import dateutil.parser
#-----------------------------------------------

utc = pytz.utc
BERLIN = pytz.timezone('Europe/Berlin')
#-----------------------------------------------

def to_iso8601(when=None, tz=BERLIN):
  if not when:
    when = datetime.datetime.now(tz)
  if not when.tzinfo:
    when = tz.localize(when)
  _when = when.strftime("%Y-%m-%dT%H:%M:%S.%f%z")
  return _when[:-8] + _when[-5:] # Remove microseconds
#-----------------------------------------------

def from_iso8601(when=None, tz=BERLIN):
  _when = dateutil.parser.parse(when)
  if not _when.tzinfo:
    _when = tz.localize(_when)
  return _when
#-----------------------------------------------
于 2013-09-22T09:06:24.120 に答える
9

まだ試していませんが、pyiso8601はこれをサポートすると約束しています。

于 2010-05-17T18:29:04.117 に答える
8
import datetime, time
def convert_enddate_to_seconds(self, ts):
    """Takes ISO 8601 format(string) and converts into epoch time."""
    dt = datetime.datetime.strptime(ts[:-7],'%Y-%m-%dT%H:%M:%S.%f')+\
                datetime.timedelta(hours=int(ts[-5:-3]),
                minutes=int(ts[-2:]))*int(ts[-6:-5]+'1')
    seconds = time.mktime(dt.timetuple()) + dt.microsecond/1000000.0
    return seconds

これには、ミリ秒とタイムゾーンも含まれます。

時間が「2012-09-30T15:31:50.262-08:00」の場合、これはエポック時間に変換されます。

>>> import datetime, time
>>> ts = '2012-09-30T15:31:50.262-08:00'
>>> dt = datetime.datetime.strptime(ts[:-7],'%Y-%m-%dT%H:%M:%S.%f')+ datetime.timedelta(hours=int(ts[-5:-3]), minutes=int(ts[-2:]))*int(ts[-6:-5]+'1')
>>> seconds = time.mktime(dt.timetuple()) + dt.microsecond/1000000.0
>>> seconds
1348990310.26
于 2012-08-29T18:34:42.767 に答える
5

Isodateは最も完全なサポートを持っているようです。

于 2010-10-21T05:10:09.293 に答える
4

aniso8601がこれを処理する必要があります。また、Python 2 と Python 3 のタイムゾーンも理解し、必要に応じてISO 8601の残りの部分を適切にカバーしています。

import aniso8601
aniso8601.parse_datetime('2007-03-04T21:08:12')
于 2014-02-14T13:54:29.183 に答える
-15

これらの種類の変換を行うための非常に簡単な方法を次に示します。解析や追加のライブラリは必要ありません。クリーンでシンプル、かつ高速です。

import datetime
import time

################################################
#
# Takes the time (in seconds),
#   and returns a string of the time in ISO8601 format.
# Note: Timezone is UTC
#
################################################

def TimeToISO8601(seconds):
   strKv = datetime.datetime.fromtimestamp(seconds).strftime('%Y-%m-%d')
   strKv = strKv + "T"
   strKv = strKv + datetime.datetime.fromtimestamp(seconds).strftime('%H:%M:%S')
   strKv = strKv +"Z"
   return strKv

################################################
#
# Takes a string of the time in ISO8601 format,
#   and returns the time (in seconds).
# Note: Timezone is UTC
#
################################################

def ISO8601ToTime(strISOTime):
   K1 = 0
   K2 = 9999999999
   K3 = 0
   counter = 0
   while counter < 95:
     K3 = (K1 + K2) / 2
     strK4 = TimeToISO8601(K3)
     if strK4 < strISOTime:
       K1 = K3
     if strK4 > strISOTime:
       K2 = K3
     counter = counter + 1
   return K3

################################################
#
# Takes a string of the time in ISO8601 (UTC) format,
#   and returns a python DateTime object.
# Note: returned value is your local time zone.
#
################################################

def ISO8601ToDateTime(strISOTime):
   return time.gmtime(ISO8601ToTime(strISOTime))


#To test:
Test = "2014-09-27T12:05:06.9876"
print ("The test value is: " + Test)
Ans = ISO8601ToTime(Test)
print ("The answer in seconds is: " + str(Ans))
print ("And a Python datetime object is: " + str(ISO8601ToDateTime(Test)))
于 2014-09-27T22:30:47.157 に答える