获取文件的 Epoch 时间戳,转换为 DateTime,转换为字符串,然后转换为具有微秒精度的相同纪元浮点数

Get File's Epoch timestamp, convert to DateTime, to string, and then to the identical epoch float with microsecond precision

提问人:Marc B. Hankin 提问时间:8/30/2022 更新时间:8/30/2022 访问量:115

问:

我想获取文件的纪元时间戳浮点数(例如,“1661796943.8816772”),并将该浮点数转换为我认为称为 DateTime 字符串的内容,并将该 DateTime 字符串转换回与我开始使用的浮点数相同的浮点数,即从 ."os.stat(__file__).st_mtime""os.stat(__file__).st_mtime"

我认为我的 DateTime 字符串具有我想要的精度(例如,“2022,08,29,11,15,43,881677”),并且我能够将其转换为 DateTime 对象:

print(my_DateTime_obj)
>>2022-08-29 11:15:43.881677

但是我发现将 DateTime 对象转换为纪元浮点数的例程缺乏原始浮点数 (“1661796943.8816772”) 的很多精度:

print(time.mktime(DateTime_obj.timetuple()))
>>1661796943.0

我认为timetuple()是问题所在,但我无法弄清楚。 有关如何将 DateTime 对象转换为纪元浮点数的任何提示,而不会丢失我认为的微秒精度,将不胜感激。
我承认,我离理解 mktime()、timetuple() 以及“结构化时间”的真正含义还有很长的路要走。

python 日期时间 mktime

评论


答:

1赞 FObersteiner 8/30/2022 #1

使用 DateTime 模块

import os
from datetime import datetime, timezone

import numpy as np

# file modification time, seconds since Unix epoch
unix0 = os.stat(__file__).st_mtime

# to datetime object
dt = datetime.fromtimestamp(unix0, tz=timezone.utc)
print(dt.isoformat(timespec="microseconds"))
# e.g.
# 2022-08-30T08:31:32.117021+00:00

# datetime object back to Unix time
unix1 = dt.timestamp()

# assert equal with microsecond precision
assert np.isclose(unix0, unix1, atol=1e-6)

注意:如果不设置 ,datetime 对象将是幼稚的(而不是时区感知的),并且类似于本地时间。尽管如此,转换仍将正常工作。tz=timezone.utc

评论

0赞 Marc B. Hankin 8/31/2022
对于我延迟承认您的代码有效,我深表歉意。当我在 Anaconda Python 3.8.5 中运行您的代码时,我收到一堆错误,开头是:[C:\ProgramData\Anaconda3\lib\site-packages\numpy_init_.py:138:UserWarning:mkl-service 包无法导入] 我会继续尝试修复它,或者在线找到一个虚拟的 python 环境,我可以在其中运行您的代码,我会在明天之前确认你是对的。
0赞 FObersteiner 8/31/2022
@MarcB.Hankin,你得到的警告是由numpy引起的;您可以通过注释掉我的代码示例中使用 numpy 的行来避免它。我只是把它放在那里用于演示目的,时间戳转换不需要工作。