提问人:Marc B. Hankin 提问时间:8/30/2022 更新时间:8/30/2022 访问量:115
获取文件的 Epoch 时间戳,转换为 DateTime,转换为字符串,然后转换为具有微秒精度的相同纪元浮点数
Get File's Epoch timestamp, convert to DateTime, to string, and then to the identical epoch float with microsecond precision
问:
我想获取文件的纪元时间戳浮点数(例如,“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() 以及“结构化时间”的真正含义还有很长的路要走。
答:
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 的行来避免它。我只是把它放在那里用于演示目的,时间戳转换不需要工作。
评论