web-dev-qa-db-ja.com

pythonタイムスタンプ文字列をエポックに変換する方法は?

次の文字列があります。

mytime = "2009-03-08T00:27:31.807Z"

Pythonでエポックに変換するにはどうすればよいですか?

私は試した:

import time
p = '%Y-%m-%dT%H:%M:%S'
int(time.mktime(time.strptime(s, p)))

ただし、31.807Zでは機能しません。

10
Rolando

2つの部分があります。

  1. 時間文字列を分解された時間に変換します。参照 PythonでISO形式の日付を解析する方法?
  2. TC時間を「エポックからの秒数」(POSIXタイムスタンプ) に変換します。
_#!/usr/bin/env python
from datetime import datetime

utc_time = datetime.strptime("2009-03-08T00:27:31.807Z", "%Y-%m-%dT%H:%M:%S.%fZ")
Epoch_time = (utc_time - datetime(1970, 1, 1)).total_seconds()
# -> 1236472051.807
_

秒の小数部を無視して整数の結果を取得することが確実である場合:

_#!/usr/bin/env python
import time
from calendar import timegm

utc_time = time.strptime("2009-03-08T00:27:31.807Z", "%Y-%m-%dT%H:%M:%S.%fZ")
Epoch_time = timegm(utc_time)
# -> 1236472051
_

_Wed July 1 2:59:60 MSK 2015_などのうるう秒に対応するタイムスタンプをサポートするには、 time.strptime()datetimeの組み合わせを使用します(うるう秒に関心がある場合は、マイクロ秒も考慮に入れてください)

17
jfs

不足しています.%fZからフォーマット文字列。

p = '%Y-%m-%dT%H:%M:%S.%fZ'

エポックに変換する正しい方法は、datetimeを使用することです。

from datetime import datetime

p = '%Y-%m-%dT%H:%M:%S.%fZ'
mytime = "2009-03-08T00:27:31.807Z"
Epoch = datetime(1970, 1, 1)
print((datetime.strptime(mytime, p) - Epoch).total_seconds())

または、分数を無視する場合は、intを呼び出します。

8

dateutilは、タイムゾーンオフセット識別子(Z)を正しく処理できる唯一のライブラリです。

pip install python-dateutil

その後

from dateutil.parser import parse as date_parse
print date_parse("2009-03-08T00:27:31.807Z")
#get timestamp

import calendar
dt =  date_parse("2009-03-08T00:27:31.807Z")
timestamp1 = calendar.timegm(dt.timetuple())
4
Joran Beasley

コード:

_import datetime
Epoch = datetime.datetime(1970, 1, 1)

mytime = "2009-03-08T00:27:31.807Z"
myformat = "%Y-%m-%dT%H:%M:%S.%fZ"
mydt = datetime.datetime.strptime(mytime, myformat)
val = (mydt - Epoch).total_seconds()

print(val)
> 1236472051.81
repr(val)
> '1236472051.807'
_

ノート:

  • time.strptime()を使用する場合、返される _time.struct_time_ は1秒未満の精度をサポートしていません。
  • _%f_ format はマイクロ秒用です。解析するときは、完全な6桁である必要はありません。
2
Nayuki