【问题标题】:Python: Msgpack-Numpy cannot handle my data?Python:Msgpack-Numpy 无法处理我的数据?
【发布时间】:2018-07-13 19:49:02
【问题描述】:

我正在尝试使用 msgpack 和 msgpack-numpy 序列化一些数据。我的代码如下:

import msgpack
import msgpack_numpy
msgpack_numpy.patch()
print(products[0]['data']['AMAZON_time'])

def decode_datetime(obj):
    if b'__datetime__' in obj:
        obj = datetime.datetime.strptime(obj[b'as_str'].decode(), "%Y%m%dT%H:%M:%S.%f")
    return obj

def encode_datetime(obj):
    if isinstance(obj, datetime.datetime):
        obj = {'__datetime__': True, 'as_str':obj.strftime("%Y%m%dT%H:%M:%S.%f").encode()}
    return obj

with open('bookData.msgpack','wb') as outfile:
    msgpack.pack(products[0]['data']['AMAZON_time'],outfile,default=encode_datetime)

with open('bookData.msgpack','rb') as infile:
    data = msgpack.unpack(infile,object_hook=decode_datetime)

这会引发以下错误:

  ValueError: cannot create an OBJECT array from memory buffer

打印时,我尝试存储的对象如下所示:

[datetime.datetime(2017, 3, 23, 12, 44) datetime.datetime(2018, 6, 8, 6, 0)
 datetime.datetime(2018, 6, 8, 8, 28) datetime.datetime(2018, 6, 8, 10, 8)
 datetime.datetime(2018, 6, 8, 14, 56) datetime.datetime(2018, 6, 8, 21, 8)
 datetime.datetime(2018, 6, 8, 21, 56)
 datetime.datetime(2018, 6, 8, 23, 44) datetime.datetime(2018, 6, 9, 0, 36)]

但是,如果我打印products[0]['data'],我会得到包含dtype=Object 字样的东西(不确定这是否相关,但考虑到错误的措辞,我想我会提到它)。

知道我做错了什么吗?

编辑:我不知道它是否相关,但我可以用 pickle 保存和加载相同的数据。

【问题讨论】:

    标签: python numpy datetime serialization msgpack


    【解决方案1】:

    我已经通过手动编码保存时间戳(作为整数)而不是日期时间对象的 numpy 数组的翻译函数解决了这个问题。我相信 MSGPACK(即使添加了 MSGPACK-NUMPY)只是无法处理日期时间对象的数组,即使使用手动编码的日期时间对象的解码器和编码器(问题在于对象类型的 numpy 数组,而不是真正的日期时间对象)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-31
      • 2018-08-27
      • 1970-01-01
      • 1970-01-01
      • 2013-12-18
      • 2017-10-25
      • 2011-07-28
      • 1970-01-01
      相关资源
      最近更新 更多