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

Azure Kusto Python SDK:如何保留dynamic值中的datetime数据类型?

问题描述

使用Kusto Python SDK从Azure Data Explorer查询数据时,单个Kusto datetime类型值会自动转为Python原生datetime类型,但通过make_list聚合或dynamic包裹的datetime会被转为字符串。示例如下:

单个datetime的正常转换

from azure.kusto.data import KustoClient, KustoConnectionStringBuilder

cluster = "https://help.kusto.windows.net"
kcsb = KustoConnectionStringBuilder.with_az_cli_authentication(cluster)
client = KustoClient(kcsb)
db_name = "Samples"

query_1 = "print x=datetime(2022-09-22)"
response_1 = client.execute_query(db_name, query_1)
result_1 = response_1.primary_results[0].to_dict()["data"]
print(result_1)
print(type(result_1[0]["x"]))

执行结果:

[{'x': datetime.datetime(2022, 9, 22, 0, 0, tzinfo=tzutc())}]
<class 'datetime.datetime'>

dynamic包裹datetime的字符串转换问题

query_2 = "print x=dynamic(datetime(2022-09-22))"
response_2 = client.execute_query(db_name, query_2)
result_2 = response_2.primary_results[0].to_dict()["data"]
print(result_2)
print(type(result_2[0]["x"]))

执行结果:

[{'x': '2022-09-22T00:00:00.0000000Z'}]
<class 'str'>

原因是make_list返回dynamic类型,该类型会序列化为JSON,而JSON无原生datetime类型,因此被转为ISO格式字符串。

解决方案

方案1:在Kusto查询中使用pack_datetime标记类型

Kusto提供pack_datetime函数,可将datetime序列化为包含类型信息的dynamic对象,SDK会自动识别并转换为Python原生datetime:

# 单个dynamic datetime的修正查询
query_3 = "print x=pack_datetime(datetime(2022-09-22))"
response_3 = client.execute_query(db_name, query_3)
result_3 = response_3.primary_results[0].to_dict()["data"]
print(result_3)
print(type(result_3[0]["x"]))

执行结果:

[{'x': datetime.datetime(2022, 9, 22, 0, 0, tzinfo=tzutc())}]
<class 'datetime.datetime'>

针对make_list聚合场景:

# 聚合列表的修正查询
query_4 = "datatable(dt:datetime)[datetime(2022-09-22), datetime(2022-09-23)] | summarize list_dt=make_list(pack_datetime(dt))"
response_4 = client.execute_query(db_name, query_4)
result_4 = response_4.primary_results[0].to_dict()["data"]
print(result_4)
print(type(result_4[0]["list_dt"][0]))

执行结果中列表内的每个元素都会是Python原生datetime类型。

方案2:在Python客户端手动转换字符串为datetime

如果无法修改Kusto查询,可在Python中手动将ISO格式字符串转为datetime:

from datetime import datetime

# 处理单个字符串datetime
dt_str = result_2[0]["x"]
dt_obj = datetime.fromisoformat(dt_str.replace("Z", "+00:00"))
print(dt_obj)
print(type(dt_obj))

方案3:使用to_dataframe()自动转换

SDK的KustoResultTable提供to_dataframe()方法,Pandas会自动将ISO格式字符串转为datetime64类型,可进一步转为原生datetime:

df = response_2.primary_results[0].to_dataframe()
print(type(df["x"][0]))  # <class 'pandas._libs.tslibs.timestamps.Timestamp'>
# 转为原生datetime
native_dt = df["x"][0].to_pydatetime()
print(type(native_dt))  # <class 'datetime.datetime'>

内容的提问来源于stack exchange,提问作者rrobby86

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 23:15:42