You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_dttmupdate_dttmwo_id
2021-5-092021-5-09ABC-63953
2021-5-092021-5-09ABC-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 06:33:38