使用df.to_json(orient="records")时datetime列转数字的解决方法
问题:Pandas DataFrame转JSON时datetime列变为时间戳数字如何解决?
使用df.to_json(orient="records")将Pandas DataFrame转换为JSON时,datetime类型的created_at列被转为时间戳数字,同时NaT值转为了字符串"None"。
转换前的DataFrame数据:
====================================== id name is_healthy health_updated_at created_at 0 203 vsds_anpr4_17_850_rhs False NaT 2022-12-13 18:29:00 1 202 vsds_anpr4_17_890_rhs False NaT 2022-12-13 18:27:00 2 201 vsds_radar_17_700_rhs False NaT 2022-12-13 18:26:00 3 200 vsds_radar_17_300_rhs False NaT 2022-12-13 18:23:00 4 199 vsds_anpr4_1_000_rhs False NaT 2022-09-12 12:00:00 ======================================
转换后的JSON数据:
[ { "id":203, "name":"vsds_anpr4_17_850_rhs", "is_healthy":false, "health_updated_at":"None", "created_at":1670956140000 }, { "id":202, "name":"vsds_anpr4_17_890_rhs", "is_healthy":false, "health_updated_at":"None", "created_at":1670956020000 }, { "id":201, "name":"vsds_radar_17_700_rhs", "is_healthy":false, "health_updated_at":"None", "created_at":1670955960000 }, { "id":200, "name":"vsds_radar_17_300_rhs", "is_healthy":false, "health_updated_at":"None", "created_at":1670955780000 }, { "id":199, "name":"vsds_anpr4_1_000_rhs", "is_healthy":false, "health_updated_at":"None", "created_at":1662984000000 } ]
解决方法
方法1:使用to_json内置参数直接处理
利用date_format指定datetime输出格式,同时用default_handler处理NaT值:
import pandas as pd json_result = df.to_json( orient="records", date_format='iso', default_handler=lambda x: None if pd.isna(x) else str(x), indent=2 )
date_format='iso':将datetime转为ISO标准字符串(如"2022-12-13T18:29:00")default_handler:自定义空值处理,把NaT转为JSON的null而非"None"字符串
方法2:手动转换列格式后转JSON
先将datetime列转为指定格式的字符串,同时处理NaT值:
import pandas as pd # 转换created_at为目标格式字符串 df['created_at'] = df['created_at'].dt.strftime('%Y-%m-%d %H:%M:%S') # 将NaT转为None,避免JSON中出现"None" df['health_updated_at'] = df['health_updated_at'].apply( lambda x: None if pd.isna(x) else x.strftime('%Y-%m-%d %H:%M:%S') ) # 生成JSON json_result = df.to_json(orient="records", indent=2)
这种方式可以完全自定义datetime的输出格式,比如你需要的"2022-12-13 18:29:00"格式。
内容的提问来源于stack exchange,提问作者Ibrahim Khan
相关产品推荐
相关产品推荐

