2

標準ライブラリを使用するだけで、Python で ISO8601 時間形式を秒/UNIX/エポック時間に変換しようとしています。

時間形式 = '2012-09-30T15:31:50.262-08:00'

基本的に、時間は解析して秒に戻す文字列になります。

必要な値をスライスして選択することは可能ですが、これよりも良い方法はありますか?

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
4

2 に答える 2

2

セラダの答えの後の最後の正解。以下では、両方のxml.iso8601.parseの出力も、関数によって生成されたものと同じ結果を返すことを確認しました。元のコードで問題を提供してくれたCeladaに感謝します。

>>> import calendar, datetime, time 
>>> def convert_enddate_to_seconds(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 = calendar.timegm(dt.timetuple()) + dt.microsecond/1000000.0
...   return seconds
... 
>>> import iso8601
>>> ts = '2012-09-30T15:31:50.262-08:00'
>>> iso8601.parse(ts)
1349047910.0
>>> convert_enddate_to_seconds(ts)
1349047910.26
>>> 
于 2012-09-04T17:14:23.010 に答える
1

まず、サンプル コードに少なくとも 4 つのバグがあります。

  • あなたのstrptimeフォーマットでは、秒の後に小数点と数字が必要ですが、サンプル入力にはそれがありません。
  • ビットは、文字列のts[:-7]端を正しくスライスしません。ts[:-6]より正確に思えます: 文字列の末尾から 6 文字を切り取りたいとします (2 は tz 時間、2 は tz 分、1 は :、および 1 は + または - です)。
  • 代わりに、タイムゾーンオフセットを減算する必要がある場所に追加しています。UTC に戻すには、東半球のタイムゾーンで指定された時間から時間と分を加算するのではなく、減算する必要があります。
  • time.mktime()timetuple が現地時間で指定されていると仮定して使用していますが、実際には UTC です。calendar.timegm()代わりに使用する必要があります。

これが更新されたコードですが、後者の 3 つの問題があります。最初の問題は残ります。入力文字列に小数秒を強制する意図があるかどうかわからなかったからです。さらに調整できます。

import datetime, time, calendar

def convert_enddate_to_seconds(ts):
    """Takes ISO 8601 format(string) and converts into epoch time."""
    dt = datetime.datetime.strptime(ts[:-6],'%Y-%m-%dT%H:%M:%S.%f')-\
                datetime.timedelta(hours=int(ts[-5:-3]),
                minutes=int(ts[-2:]))*int(ts[-6:-5]+'1')
    seconds = calendar.timegm(dt.timetuple()) + dt.microsecond/1000000.0
    return seconds

テスト入力として使用2010-01-04T12:15:30.1+01:00すると、正しい出力として 1262603730.1 が得られます。

あなたの質問については、いいえ、標準ライブラリに限定するだけでは、それよりもはるかに簡潔になることはほとんどありません。

于 2012-09-01T02:55:21.270 に答える