我正在尝试从以下嵌套的 json 中提取一些字段并写入一个单独的 csv 文件:
{
"AccountID": "00000000-0000-0000-0000-000000000000",
"LocationID": "00000000-0000-0000-0000-000000000000",
"CreatedBy": "string",
"ModifiedBy": "string",
"Created": "string",
"Modified": "string",
"LocationData": {
"KeyFields": {},
"DisplayPoint": {
"Type": "Calculated",
"Latitude": 0.0,
"Longitude": 0.0,
"VerificationType": "Client"
},
"BusinessStatus": "Open",
"Status": "Active",
"BusinessName": {
"Name": "string",
"LongName": "string",
"Locale": "Not_set"
},
"BusinessDescription": {
"Description": "string",
"ShortDescription": "string",
"LongDescription": "string"
},
"PrimaryAddress": {
"AddressLine1": "string",
"AddressLine2": "string",
"AddressLine3": "string",
"AddressLine4": "string",
"AddressLine5": "string",
"Neighborhood": "string",
"Locality": "string",
"Region": "string",
"PostalCode": "string",
"CountryCode": "string"
},
"PhoneNumbers": {
"PrimaryPhoneNumber": "string",
"Landline": "string",
"Mobile": "string",
"Fax": "string",
"TollFree": "string"
},
"HoursOfOperationStructured": {
"Su": {
"Ranges": [
{
"StartTime": "string",
"EndTime": "string"
}
],
"State": "Open",
"AdditionalInfo": "string"
},
"Mo": {
"Ranges": [
{
"StartTime": "string",
"EndTime": "string"
}
],
"State": "Open",
"AdditionalInfo": "string"
},
"Tu": {
"Ranges": [
{
"StartTime": "string",
"EndTime": "string"
}
],
"State": "Open",
"AdditionalInfo": "string"
},
"We": {
"Ranges": [
{
"StartTime": "string",
"EndTime": "string"
}
],
"State": "Open",
"AdditionalInfo": "string"
},
"Th": {
"Ranges": [
{
"StartTime": "string",
"EndTime": "string"
}
],
"State": "Open",
"AdditionalInfo": "string"
},
"Fr": {
"Ranges": [
{
"StartTime": "string",
"EndTime": "string"
}
],
"State": "Open",
"AdditionalInfo": "string"
},
"Sa": {
"Ranges": [
{
"StartTime": "string",
"EndTime": "string"
}
],
"State": "Open",
"AdditionalInfo": "string"
},
"SpecialHours": [
{
"Date": "string",
"Ranges": [
{
"StartTime": "string",
"EndTime": "string"
}
],
"State": "Open",
"AdditionalInfo": "string"
}
]
}
}
我可以使用 pandas 和 json_normalize 来展平数据。然后我可以通过引用我想要的字段(如 df['LocationData.PrimaryAddress.Locality']
)来提取字段。这适用于我需要的所有字段,除了抛出 KeyError 的“StartTime”和“EndTime”范围
当我尝试通过像这样引用它来提取任何特定日期的“开始时间”或“结束时间”范围时:df['LocationData.HoursOfOperationStructured.Su.Ranges.StartTime']
----它返回一个
KeyError: "['LocationData.HoursOfOperationStructured.Su.Ranges.StartTime'] not in index"
如何使用 pandas 从该文件中访问所有天的“StartTime”/“EndTime”列?
答案 0 :(得分:0)
列 df['LocationData.HoursOfOperationStructured.Su.Ranges']
和所有其他类似的列都被“欠规范化”:它们包含字典的单元素列表,键为“StartTime”和“EndTime”。您可以在循环中将这些字典列转换为“真实”列,然后与原始数据框连接:
ranges = df.columns[df.columns.str.match('.*Ranges.*')]
missing = [df[r].str[0].apply(pd.Series)\
.rename(columns={'StartTime' : f"{r}.StartTime",
'EndTime' : f"{r}.EndTime"})
for r in ranges]
df = df.join(pd.concat(missing, axis=1))
它很丑,但很管用。