日期无法序列化

时间:2017-10-03 14:25:17

标签: pandas parquet fastparquet

我在尝试将数据框保存为文件时收到错误。

from fastparquet import write 
write('profile_dtl.parq', df)

该错误与" date"相关。并且错误消息看起来像这样......

ValueError: Can't infer object conversion type: 0    1990-01-01
1    1954-01-01
2    1981-11-15
3    1993-01-21
4    1948-01-01
5    1977-01-01
6    1968-04-28
7    1969-01-01
8    1989-01-01
9    1985-01-01
Name: dob, dtype: object

我已经检查过该列是"对象"就像任何其他可以序列化而没有任何问题的列一样。如果我删除" dob"从数据框中的列,然后这一行将起作用。如果有日期+时间,这也会有效。

快速镶木地板不接受日期?

1 个答案:

答案 0 :(得分:1)

尝试将dob更改为datetime64 dtype:

import pandas as pd
dob = pd.Series(['1954-01-01', '1981-11-15', '1993-01-21', '1948-01-01',
                 '1977-01-01', '1968-04-28', '1969-01-01', '1989-01-01',
                 '1985-01-01'], name='dob')
Out:
0    1954-01-01
1    1981-11-15
2    1993-01-21
3    1948-01-01
4    1977-01-01
5    1968-04-28
6    1969-01-01
7    1989-01-01
8    1985-01-01
Name: dob, dtype: object

请注意产生的dtype:

pd.to_datetime(dob)

Out:
0   1954-01-01
1   1981-11-15
2   1993-01-21
3   1948-01-01
4   1977-01-01
5   1968-04-28
6   1969-01-01
7   1989-01-01
8   1985-01-01
dtype: datetime64[ns]

将此系列用作DataFrame中的索引:

baz = list(range(9))
foo = pd.DataFrame(baz, index=pd.to_datetime(dob), columns=['dob'])

您现在应该可以保存您的Parquet文件了。

from fastparquet import write

write('foo.parquet', foo)

$ls -l foo.parquet
-rw-r--r--  1 moi  admin  854 Oct 13 16:44 foo.parquet

<小时/> 您的dob系列有一个对象dtype,而object_encoding='infer'参数保持不变fastparquet.write。所以,从docs

  

“特殊值'推断'将导致从前十个非空值中猜出类型。”

Fastparquet没有try to infer日期值与bytes|utf8|json|bson|bool|int|float之间的日期值相同。