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
相关产品推荐
相关产品推荐

