在Python中将日期时间写入和读取为二进制格式

时间:2013-08-29 16:42:48

标签: python datetime binary timestamp unpack

我想在Python中以二进制文件存储日期时间列表。

编辑:“二进制”是指每种数据类型的最佳数字表示。应用程序是保存由(unix-timestamp,纬度,经度,海拔)组成的GPS跟踪点,因此整个结构是小端“Long,float,float,float”,每个值有四个字节。

注意:由于对Unix平台的任何影响,我不使用“unix-timestamp”,而只是作为表示日期时间值的明确方式。

目前,我正在执行下面的代码,但除了一些时区混乱,我仍在努力(我的时区为-3),我相信转换为int并返回可能不是正确的方式,因为datetimedatetime64是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方法吗?”

并且附带的问题是:“如果此代码中的所有内容都应该是天真的,为什么我会有时区偏移?”

感谢阅读!

3 个答案:

答案 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)