7

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

编辑:“二进制”是指每种数据类型的最佳数字表示。其应用是保存由 (unix-timestamp, latitude, longitude, elevation) 组成的 GPS 轨迹点,所以整个结构是 little-endian “Long,float,float,float”,每个值有四个字节。

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

目前,我正在像下面的代码一样做,但除了一些我仍在解决的时区混乱(我的时区是-3)之外,我相信转换int和返回可能不是正确的方法,因为datetimedatetime64是 python 中的本机类型/numpy,如果我没记错的话。因此,adatetime64需要八个字节,而不是我用于(长)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方法吗?”

另外一个问题是:“如果这段代码中的所有内容都应该是幼稚的,为什么我有一个时区偏移量?”

谢谢阅读!

4

3 回答 3

6

我找到了一种使用 Unix 时间戳并将其存储为整数的方法。这对我有用,因为我不需要亚秒级分辨率,但我认为长整数可以通过对代码进行一些修改来实现微秒级分辨率。

对我原来的更改包括替换calendar.timegmbytime.mktimeutctimetupleby 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文件,然后再读回来。

于 2013-09-02T14:10:13.560 回答
2

到目前为止,最简单的解决方案是使用 Temporenc:http ://temporenc.readthedocs.org/

它负责所有编码/解码,并允许您将 Python 日期时间对象写入文件:

now = datetime.datetime.now()
temporenc.pack(fp, now)

要回读它,这就足够了:

dt = temporenc.unpack(fp)
print(dt)
于 2014-12-18T12:38:34.137 回答
0

如果你想将一个对象保存到一个二进制文件中,你可以考虑pickle

据我所知,它写入一个字节流,所以它足够二进制,但结果是

特定于 Python 的

另外,我认为它应该与日期时间一起使用。

你会得到这个来保存:

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()
于 2013-08-29T17:38:02.880 回答