web-dev-qa-db-ja.com

PythonでISO 8601日付時刻を秒に変換する

私は一緒に2回追加しようとしています。 ISO 8601のタイムスタンプは「1984-06-02T19:05:00.000Z」であり、秒に変換したいと思います。 Pythonモジュール iso8601 ですが、これはパーサーにすぎません。

助言がありますか?

20
Zaynaib Giwa

エポックからの秒数を取得する場合は、python-dateutilを使用してdatetimeオブジェクトに変換し、strftimeメソッドを使用して秒数に変換できます。そのようです:

>>> import dateutil.parser as dp
>>> t = '1984-06-02T19:05:00.000Z'
>>> parsed_t = dp.parse(t)
>>> t_in_seconds = parsed_t.strftime('%s')
>>> t_in_seconds
'455047500'

だからあなたは途中にいた:)

21
hopla

あなたの日付は RFC 3339形式 のUTC時間です。stdlibだけを使用して解析できます。

_from datetime import datetime

utc_dt = datetime.strptime('1984-06-02T19:05:00.000Z', '%Y-%m-%dT%H:%M:%S.%fZ')

# Convert UTC datetime to seconds since the Epoch
timestamp = (utc_dt - datetime(1970, 1, 1)).total_seconds()
# -> 455051100.0
_

参照Pythonでdatetime.dateをUTCタイムスタンプに変換する

ISO 8601形式に戻すにはどうすればよいですか?

POSIXタイムスタンプを元に戻すには、そこからUTC日時オブジェクトを作成し、.strftime()メソッドを使用してフォーマットします。

_from datetime import datetime, timedelta

utc_dt = datetime(1970, 1, 1) + timedelta(seconds=timestamp)
print(utc_dt.strftime('%Y-%m-%dT%H:%M:%S.%fZ'))
# -> 1984-06-02T19:05:00.000000Z
_

注:小数点以下6桁(マイクロ秒)を出力します。 3桁を取得するには、マイクロ秒を小数点以下2桁にフォーマットする(実際にはマイクロ秒を数十マイクロ秒に変換する)を参照してください。

13
jfs

これはPython 3の解決策です:

$ date +%s
1428030452
$ TZ=US/Pacific date -d @1428030452 '+%Y%m%d %H:%M:%S %z'
20150402 20:07:32 -0700
$ TZ=US/Eastern date -d @1428030452 '+%Y%m%d %H:%M:%S %z'
20150402 23:07:32 -0400
$ python3
>>> from datetime import datetime,timezone
>>> def iso2Epoch(ts):
...     return int(datetime.strptime(ts[:-6],"%Y%m%d %H:%M:%S").replace(tzinfo=timezone.utc).timestamp()) - (int(ts[-2:])*60 + 60 * 60 * int(ts[-4:-2]) * int(ts[-5:-4]+'1'))
...
>>> iso2Epoch("20150402 20:07:32 -0700")
1428030452
>>> iso2Epoch("20150402 23:07:32 -0400")
1428030452
>>>
0
toppk