Matlab datenum для python, я получаю ошибку около 3 часов

#python #matlab #datetime #timestamp

#python #matlab #дата и время #временная метка

Вопрос:

Я работаю со временем в Matlab, используя datenum, включая миллисекунды (datenum(‘2019-10-16 23:58:57.970’) == 737714.999282060) и я хочу получить тот же номер в python, но я получаю другой номер (около 3 часов ошибки).

Я знаю, что datenum возвращает дни с 1 года, а timestamp() возвращает секунды с 1970 года, поэтому:

 datenum1970 = 719529 #datenum('1970-01-01 00:00:00.0')

datenum_example_2 = 737714.999282060 #datenum('2019-10-16 23:58:57.970'), some date
d_example_2 = datetime(2019,10,16,23,58,57,970) #same date in datetime library
d_example_2_days = d_example_2.timestamp()/(24*3600)   datenum1970 # == 737715.1242708445

(d_example_2_days - datenum_example_2)*24 ==  2.9997308291494846 # thats the error, about 3 hours
  

Другой пример выдает ошибку 2.9998057410120964 (очень похожую, но не равную, поэтому я не могу использовать ошибку как константу для устранения проблемы)

Ответ №1:

вам нужно установить часовой пояс (здесь: UTC); в противном случае timestamp() предполагается, что объект datetime, для которого вы вызываете метод, является местным временем, и добавляет / вычитает соответствующее смещение UTC в секундах.

 from datetime import datetime, timezone

datenum1970 = 719529 #datenum('1970-01-01 00:00:00.0')
datenum_example_2 = 737714.999282060 #datenum('2019-10-16 23:58:57.970'), some date
d_example_2 = datetime(2019,10,16,23,58,57,970, tzinfo=timezone.utc)

d_example_2_days = d_example_2.timestamp()/(24*3600)   datenum1970
# 737714.9992708445

(d_example_2_days - datenum_example_2)*24
# -0.0002691708505153656
  

Примечание: возможно, вам также захочется взглянуть на функции преобразования формата даты и времени Matlab, например, если у вас есть

 ts_m = posixtime(datetime('2019-10-16 23:58:57'))
% 1.571270337000000e 09
% (use datetime(X, 'ConvertFrom', 'datenum') to get datetime from datenum)
  

в Matlab вы получаете точно такое же значение в Python:

 ts_p = datetime.fromisoformat('2019-10-16 23:58:57').replace(tzinfo=timezone.utc).timestamp()
# 1571270337.0