我想在Python中以二进制文件存储日期时间列表。
编辑:“二进制”是指每种数据类型的最佳数字表示。应用程序是保存由(unix-timestamp,纬度,经度,海拔)组成的GPS跟踪点,因此整个结构是小端“Long,float,float,float”,每个值有四个字节。
注意:由于对Unix平台的任何影响,我不使用“unix-timestamp”,而只是作为表示日期时间值的明确方式。
目前,我正在执行下面的代码,但除了一些时区混乱,我仍在努力(我的时区为-3),我相信转换为int
并返回可能不是正确的方式,因为datetime
和datetime64
是python / numpy中的本机类型,如果我没有弄错的话。因此,datetime64
需要八个字节而不是我用于(长)unix时间戳的四个字节。
import datetime
import calendar
import struct
now = datetime.datetime.now()
print now
stamp = calendar.timegm(now.utctimetuple())
print stamp
binarydatetime = struct.pack('<L', stamp)
recoverstamp = struct.unpack('<L', binarydatetime)[0]
print recoverstamp
recovernow = datetime.datetime.fromtimestamp(recoverstamp)
print recovernow
所以主要问题是:“这是将天真日期时间转换为二进制并返回的pythonic方法吗?”
并且附带的问题是:“如果此代码中的所有内容都应该是天真的,为什么我会有时区偏移?”
感谢阅读!
答案 0 :(得分:2)
我找到了一种使用Unix时间戳并将其存储为整数的方法。这对我有用,因为我不需要亚秒级分辨率,但我认为长整数将允许微秒分辨率并对代码进行一些修改。
我原来的更改包括将calendar.timegm
替换为time.mktime
,将utctimetuple
替换为timetuple
,以保持一切天真。
此:
import datetime
import struct
import time
now = datetime.datetime.now()
print now
stamp = time.mktime(now.timetuple())
print stamp
recoverstamp = datetime.datetime.fromtimestamp(stamp)
print recoverstamp
binarydatetime = struct.pack('<L', stamp)
recoverbinstamp = struct.unpack('<L', binarydatetime)[0]
print recoverbinstamp
recovernow = datetime.datetime.fromtimestamp(recoverbinstamp)
print recovernow
返回:
2013-09-02 11:06:28.064000
1378130788.0
2013-09-02 11:06:28
1378130788
2013-09-02 11:06:28
通过这种方式,我可以轻松地将打包的binarydatetime
写入文件,稍后再阅读。
答案 1 :(得分:0)
如果要将对象保存为二进制文件,可以考虑pickle
据我所知,它写了一个字节流,所以它足够二进制,但结果是
Python特定
另外,我认为它应该适用于datetime。
你将有这个用于保存:
with open('your_file', 'wb') as file:
pickle.Pickler(file).dump(your_var)
这是为了恢复
with open('your_file', 'rb') as file:
recovered=pickle.Unpickler(file).load()
答案 2 :(得分:0)
到目前为止,最简单的解决方案是使用Temporenc:http://temporenc.readthedocs.org/
它负责所有编码/解码,并允许您将Python日期时间对象写入文件:
now = datetime.datetime.now()
temporenc.pack(fp, now)
要阅读它,这就足够了:
dt = temporenc.unpack(fp)
print(dt)