为什么 json.loads 函数将我的时间戳更改为毫秒?

问题描述 投票:0回答:2

我正在开发一个 API,我正在尝试创建一个 Flask 路由来获取我的数据,但有一个问题。

将我的数据帧转换为 json 时。日期列“Mon, 15 Apr 2024 11:20:20 GMT”变为 1713177478000。

如果我希望时间戳保持其状态,我是否必须自己创建 json?

@app.route("/tipi", methods=["GET"])
def sqltipi():
    try:
        department = request.args.get("department")
        ogc_fid = request.args.get("ogc_fid")
        score = request.args.get("score")

        longitude = request.args.get("longitude")
        latitude = request.args.get("latitude")
        rayon = request.args.get("rayon")

        if longitude is not None and latitude is not None and rayon is not None:
            df= DBP.load_point_rayon_tipi(longitude,latitude,rayon)
        elif ogc_fid is not None:
            df = DBP.load_brigades_tipi(ogc_fid)
        else:
            df = DBP.load_tipi(department)

        if score is not None:
            df = df[df["score"] == int(score)]

        js = json.loads(df.to_json(orient="records"))
        return js
    except Exception as e:
        error_message = "An error occurred: " + str(e)
        return jsonify({"error": error_message}), 500
python json api
2个回答
0
投票

您观察到的日期列“Mon, 15 Apr 2024 11:20:20 GMT”被转换为像 1713177478000 这样的大整数的行为是由于 pandas.DataFrame.to_json() 方法序列化日期时间对象的方式造成的。默认情况下,pandas 将日期时间对象转换为自 Unix 纪元(1970 年 1 月 1 日)以来的毫秒数。这是处理 JSON 中的日期和时间数据的标准做法,因为 JSON 本身没有内置日期类型。

但是,如果您想在 JSON 输出中以更易于理解的字符串格式或特定格式维护日期时间,则可以调整 to_json() 方法的 date_format 参数。以下是修改 Flask 路由来处理此问题的方法:

在 to_json() 方法中使用 date_format='iso' 参数将日期时间对象转换为 ISO 8601 字符串格式,这是在 Web 应用程序中传输日期时间信息的广泛接受的格式。

确保使用 Flask 的 jsonify() 返回响应,以正确设置响应标头并正确管理 JSON 序列化。

from flask import Flask, request, jsonify
import pandas as pd
import json

app = Flask(__name__)

@app.route("/tipi", methods=["GET"])
def sqltipi():
    try:
        department = request.args.get("department")
        ogc_fid = request.args.get("ogc_fid")
        score = request.args.get("score")
        longitude = request.args.get("longitude")
        latitude = request.args.get("latitude")
        rayon = request.args.get("rayon")

        # Simulated function calls to a database or similar.
        # These would actually call your DBP.load_* functions.
        def simulate_db_query():
            # Returning a sample DataFrame with datetime column for illustration.
            return pd.DataFrame({
                "date": [pd.Timestamp("2024-04-15 11:20:20")],
                "score": [1]
            })

        if longitude is not None and latitude is not None and rayon is not None:
            df = simulate_db_query()
        elif ogc_fid is not None:
            df = simulate_db_query()
        else:
            df = simulate_db_query()

        if score is not None:
            df = df[df["score"] == int(score)]

        # Change here: using date_format='iso'
        js = df.to_json(orient="records", date_format='iso')
        data = json.loads(js)
        return jsonify(data)  # Using jsonify to return JSON response
    except Exception as e:
        error_message = "An error occurred: " + str(e)
        return jsonify({"error": error_message}), 500

if __name__ == "__main__":
    app.run(debug=True)

0
投票

您可以在 df.to_json 中传递 data_format 属性

js = json.loads(df.to_json(orient="records", date_format="iso"))

© www.soinside.com 2019 - 2024. All rights reserved.