Python连接Oracle游标结果转JSON后日期格式处理问题
解决Oracle查询结果转DataFrame的日期格式问题
问题说明
在Python连接Oracle数据库后,将游标查询结果转为JSON时,日期字段(如create_dttm、update_dttm)会被序列化为{"$date": 时间戳}格式。将这类JSON数据转为DataFrame时,无法自动转换为YYYY-M-D的日期格式,期望最终DataFrame中的日期显示为类似2021-5-09的形式。
当前代码与输出
当前相关代码:
result = cursor.execute("**my query**") data = list(result) final = json.dumps(data) print(final)
输出示例:
[{"create_dttm": {"$date": 1677264505842}, "update_dttm": {"$date": 1677264505842}, "wo_id": "ABC-63953"},{"create_dttm": {"$date": 1677264505843}, "update_dttm": {"$date": 1677264505843}, "wo_id": "ABC-63954"}]
期望的DataFrame格式:
| create_dttm | update_dttm | wo_id |
|---|---|---|
| 2021-5-09 | 2021-5-09 | ABC-63953 |
| 2021-5-09 | 2021-5-09 | ABC-63954 |
解决方法
方案1:转换为DataFrame前预处理数据
先解析JSON中的毫秒级时间戳,转换为指定格式的日期字符串,再生成DataFrame:
import json import pandas as pd from datetime import datetime # 解析JSON字符串 data = json.loads(final) # 遍历处理每个条目里的日期字段 for item in data: # 处理create_dttm if "create_dttm" in item and "$date" in item["create_dttm"]: ts = item["create_dttm"]["$date"] / 1000 # 毫秒转秒 item["create_dttm"] = datetime.fromtimestamp(ts).strftime("%Y-%-m-%-d") # 处理update_dttm if "update_dttm" in item and "$date" in item["update_dttm"]: ts = item["update_dttm"]["$date"] / 1000 item["update_dttm"] = datetime.fromtimestamp(ts).strftime("%Y-%-m-%-d") # 生成目标DataFrame df = pd.DataFrame(data) print(df)
注:
%-m/%-d用于移除月份、日期的前导零;Windows系统需替换为%#m/%#d。
方案2:直接处理已生成的DataFrame
如果已经得到包含{"$date": 时间戳}的DataFrame,可通过自定义函数批量转换列:
import pandas as pd from datetime import datetime def convert_date(date_obj): if isinstance(date_obj, dict) and "$date" in date_obj: ts = date_obj["$date"] / 1000 return datetime.fromtimestamp(ts).strftime("%Y-%-m-%-d") return date_obj # 对指定日期列应用转换函数 df["create_dttm"] = df["create_dttm"].apply(convert_date) df["update_dttm"] = df["update_dttm"].apply(convert_date) print(df)
方案3:SQL查询阶段直接格式化(推荐)
最高效的方式是在Oracle查询时就将日期转为目标格式,后续无需额外处理:
SELECT TO_CHAR(create_dttm, 'YYYY-FM-MM-FM-DD') AS create_dttm, TO_CHAR(update_dttm, 'YYYY-FM-MM-FM-DD') AS update_dttm, wo_id FROM your_table -- 补充你的查询条件
注:
FM用于移除日期部分的前导零,查询结果直接是YYYY-M-D格式的字符串。
内容的提问来源于stack exchange,提问作者Jai
相关产品推荐
相关产品推荐

