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

如何使用Python将Azure消费明细JSON响应转换为CSV文件(解决Tags字段为空问题)

解决Azure Consumption UsageDetails转CSV时Tags字段为空的问题

问题描述

我正在尝试将Azure Consumption的usageDetails JSON响应转换为CSV文件,需要导出的字段包括id、name、type、kind、tags(保留字典格式)、billingAccountId、resourceName等。我尝试直接转换为DataFrame未成功,编写的Python代码导出的CSV中tags字段为空,希望能修改代码实现正确导出所需字段,同时保留tags的字典格式。

我的原始JSON响应结构(简化示例):

{ "value": [ 
    { 
        "id": "/providers/Microsoft.Billing/Departments/1234/providers/Microsoft.Billing/billingPeriods/201903/providers/Microsoft.Consumption/usageDetails/usageDetails_Id1", 
        "name": "usageDetails_Id1", 
        "type": "Microsoft.Consumption/usageDetails", 
        "kind": "legacy", 
        "tags": { "env": "newcrp", "dev": "tools" }, 
        "properties": { 
            "billingAccountId": "xxxxxxxx", 
            "resourceName": "Resource Name 1",
            // 其他属性省略
        } 
    },
    // 更多条目...
] }

我之前的代码:

import pandas as pd
frame=pd.DataFrame()
for i in range (len(json_output['value'])):
    df1= pd.DataFrame(data={'kind':json_output['value'][i]['kind'], 'id': json_output['value'][i]['id'], 'tags': json_output['value'][i]['tags'], 'name':json_output['value'][i]['name'], 'type':json_output['value'][i]['type'], 'billingAccountid':json_output['value'][i]['properties']['billingAccountId']},index=[i])
    print(df1)
    frame=frame.append(df1)
frame.to_csv('datt.csv')

解决方案

问题出在Pandas默认会将字典类型的字段拆分为多列,且循环使用append(已弃用)的方式也容易导致数据处理异常。我们可以通过将tags转换为JSON字符串来保留其字典结构,同时优化数据处理逻辑:

import pandas as pd
import json

# 假设你的JSON数据已加载到json_output变量中
# 如果从文件读取:
# with open('your_usage_data.json', 'r') as f:
#     json_output = json.load(f)

# 收集处理后的条目
processed_entries = []

for item in json_output['value']:
    # 整合需要的字段,将tags转为JSON字符串保留结构
    entry = {
        'id': item['id'],
        'name': item['name'],
        'type': item['type'],
        'kind': item['kind'],
        'tags': json.dumps(item['tags']),  # 转换为字符串格式保留字典结构
        'billingAccountId': item['properties']['billingAccountId'],
        'resourceName': item['properties']['resourceName']
    }
    processed_entries.append(entry)

# 一次性创建DataFrame(比循环append更高效)
usage_df = pd.DataFrame(processed_entries)

# 导出CSV,禁用索引列避免冗余数据
usage_df.to_csv('azure_usage_details.csv', index=False)

说明

  1. 保留Tags结构:使用json.dumps()将tags字典转为JSON字符串,CSV中会完整显示类似{"env": "newcrp", "dev": "tools"}的结构,后续如需还原字典,可使用json.loads()解析。
  2. 优化数据处理:先收集所有条目到列表再创建DataFrame,避免了append方法的弃用问题,同时提升了处理效率。
  3. 完整提取字段:明确包含了你需要的所有字段,包括properties中的resourceName和billingAccountId。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 22:02:44