python-3.x - 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 中,如果您将不包含时区信息或 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包。
推荐阅读
- ios - 在显示之前将 ViewController 加载到 ContainerView 中,因此没有可见的过渡
- variables - 如何在 Lua 中获取表的实际副本?
- javascript - “获取”某些数据时重音问题
- virtualbox - 在 Manjaro(Arch Linux)上通过 AUR 构建 v8 失败 - 消息:“错误:check() 中发生故障”
- spring-boot - 扩展组件的服务的 Spring Boot 测试配置
- redux - 减速器:面向动作的减速器还是面向结构的减速器?
- javascript - 我怎样才能通过
在对象中的字符串中作为子组件的道具? - java - 在 SpringBoot 2.1.1.RELEASE 的 RestTemplate 中添加 HttpHeaders
- javascript - 使用 ES6 按 id 查找
- javascript - 我可以使用 img src 中的 alt= 的值来填写订单中的 Item# 字段吗?