微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – Pandas to_json没有为NaT输出null

我正在使用Pandas 0.12.0并且在将系列或数据帧转换为json时看到一些与文档相矛盾的行为.

如果我创建一个包含一些包含空值的日期的系列,我会得到这样的结果:

>>> s = pandas.Series(data=[datetime.datetime.Now(), datetime.datetime.Now(), None])
>>> s
0    2013-11-07 16:10:47.530771
1    2013-11-07 16:10:47.530782
2                          None
dtype: object

根据http://pandas.pydata.org/pandas-docs/dev/io.html#writing-json,当转换为json时,None,NaT和NaN值应输出为null.

如果我然后输出to_json,我得到第三个条目的null,正如预期的那样.

>>> s.to_json()
'{"0":1383840647530771000,"1":1383840647530782000,"2":null}'

但是,我需要确保数据类型是datetime64 [ns]用于其他一些计算,所以我将字段转换为Pandas中的datetime,如下所示:

>>> t = pandas.to_datetime(s)
>>> t
0   2013-11-07 16:10:47.530771
1   2013-11-07 16:10:47.530782
2                          NaT
dtype: datetime64[ns]

无现在是NaT,这是一致的和预期的.然后我尝试再次输出json,我得到NaT值的负值而不是我期望的null.

>>> t.to_json()
'{"0":1383840647530771000,"1":1383840647530782000,"2":-9223372036854775808}'

使用iso格式时会变得更糟,因为它试图格式化日期,但大多数解析器无法弄清楚如何处理输出日期,这会造成各种各样的破坏.

>>> t.to_json(date_format='iso')
'{"0":"2013-11-07T16:10:47.530771","1":"2013-11-07T16:10:47.530782","2":"0001-255-255T00:00:00"}'

关于我应该如何进行的任何想法?谢谢!

编辑:

看起来这是pandas.NaT的字符串表示的问题?

>>> str(pandas.NaT)
'0001-255-255 00:00:00'

解决方法:

有点hacky,但你可以做到这一点

 In [13]: s = Series(pd.to_datetime(['20130101',None]))

 In [14]: s
 0   2013-01-01 00:00:00 
 1                   NaT
 dtype: datetime64[ns]

 In [15]: def f(x):
             if isnull(x): 
                return 'null'
             return x.isoformat()    ....: 

 In [16]: s.apply(f).to_json() 

 Out[16]:
 '{"0":"2013-01-01T00:00:00","1":"null"}'

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐