首页 > 解决方案 > Python和MATLAB在从日期时间计算POSIX方面的分歧

问题描述

在 MATLAB 中,我可以轻松地将 datetime 对象转换为 posix:

start_time = datetime('2020-04-30 10:05:00');
start_time_unix = posixtime(start_time)

返回:

start_time_unix = 1.588241100000000e+09.

在 Python 中,我创建了一个类似的 datetime 对象并尝试将其转换为 posix:

import time
import datetime
import numpy as np

time_string = '2020-04-30 10:05:00'
calendar, clock = time_string.split(' ')
year,month,day = [np.int(x) for x in calendar.split('-')]
hour,minute,second = [np.int(x) for x in clock.split(':')]
dt = datetime.datetime(year, month, day, hour, minute, second)
ut = time.mktime(dt.timetuple())

此时,

ut = 1588262700.0

如果小时和分钟混淆,

dt2 = datetime.datetime(year, month, day, minute, hour, second)
ut2 = time.mktime(dt2.timetuple())

返回

ut2 = 1588245000.0

为什么我看到 MATLAB 和 Python 之间存在这种差异?另外,有没有办法解析日期/时间字符串并将其更有效地转换为posix?

标签: python-3.xmatlabdatetimeposix

解决方案


在 Python 中,如果您将不包含时区信息或 UTC 偏移量的日期/时间字符串解析为datetime对象,则生成的对象是幼稚的,即它不知道任何时区、DST 或 UTC 偏移量。

文档

一个天真的对象不包含足够的信息来明确地定位自己相对于其他日期/时间对象。一个简单的对象是表示协调世界时 (UTC)、当地时间还是某个其他时区的时间完全取决于程序,就像特定数字是否表示米、英里或质量一样取决于程序。朴素的对象很容易理解和使用,但代价是忽略了现实的某些方面。

默认情况下,Python 会假定一个天真的datetime对象属于您的操作系统的时区!

更多来自文档

警告:由于许多 datetime 方法将幼稚的 datetime 对象视为本地时间,因此最好使用可感知的 datetime 来表示 UTC 时间。

对于给定的示例,您需要指定时区信息以避免歧义:

from datetime import datetime, timezone

# parse to datetime, in this case we don't need strptime since string is ISO8601 compatible
dtobj = datetime.fromisoformat('2020-04-30 10:05:00')
# naive, no tz info: datetime.datetime(2020, 4, 30, 10, 5)

# add a timezone, for UTC, we can use timezone.utc from the datetime module:
dtobj = dtobj.replace(tzinfo=timezone.utc)
# tz-aware: datetime.datetime(2020, 4, 30, 10, 5, tzinfo=datetime.timezone.utc)

# now we can obtain the posix timestamp:
posix = dtobj.timestamp()

print(posix)
# 1588241100.0

如果您打算经常在 Python 中处理时间序列数据,请查看dateutil包。


推荐阅读