我正在开发一个 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
您观察到的日期列“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)
您可以在 df.to_json 中传递 data_format 属性
js = json.loads(df.to_json(orient="records", date_format="iso"))