У меня есть следующий код в Matlab.
timestamp = 1478084255 ;
TimeZone = 'Europe/Amsterdam' ;
CorrectionToMATLABTime = datenum(1970, 1, 1, 0, 0,0) ;
matlab_timestamp = CorrectionToMATLABTime + timestamp/86400 ;
d = datetime( datevec(matlab_timestamp), 'TimeZone', 'UTC' );
d.TimeZone = TimeZone ;
datenum(d)
# 736636.498321759
Каким будет код equilvent в python для получения десятичной части данных, то есть 0.498321759?
Вот что я сделал:
from datetime import datetime
import pytz
tz = pytz.timezone('UTC')
date_utc = datetime.fromtimestamp(1478084255).astimezone(tz)
first_date = datetime(date.year, 1, 1, tzinfo=tz)
(date_utc - first_date).seconds/(60*60*24)
# 0.45665509259259257
Чтобы ответить на ваш вопрос в точном выражении:
import datetime
import pytz
tz = pytz.timezone('Europe/Amsterdam')
d = datetime.datetime.utcfromtimestamp(1478084255).replace(tzinfo = pytz.utc)
d = d.astimezone(tz).replace(tzinfo = pytz.utc)
f = datetime.datetime.combine(d.date(), datetime.time()).replace(tzinfo=pytz.utc)
(d-f).total_seconds() / (60* 60* 24) # 0.498321759
Сказав это, я думаю, что вы рассчитываете не то, что, по вашему мнению, вы рассчитываете. Похоже, что в базе данных Matlab полностью игнорируется часть часового пояса объекта datetime
, которая, как я подозреваю, может быть не такой, какой вы планировали. Вы можете проверить это, подтвердив, что datenum(d)
дает тот же результат, что и datenum(datevec(d))
.
Возможно, было бы интересно выяснить, что именно вы ожидаете от этого вычисления в словах, просто чтобы проверить, действительно ли это соответствует коду, который вы предоставили. Что вы пытаетесь сделать точно?
dn = datenum(d); decimalpart = dn - floor(dn);
?