我想将JSON格式化程序文件读入pandas DataFrame中,从而将数据集按行和列进行组织。我已附上JSON文件中数据的外观图。原始数据具有从2010/01/01到2010/01/30的30天每日温度数据。
Raw JSON data in the input file '09386950_NM_USGS_TOBS.json':
$i = 0;
foreach ($html->find('.mlv-w-55 > *') as $jobs) {
$item['title'] = $html->find('h2', $i)->plaintext;
$item['location'] = $html->find('dl',$i)->plaintext;
$item['salary'] = $html->find('dl',$i)->next_sibling()->plaintext;
$item['job_type'] = $html->find('dl',$i)->next_sibling()->next_sibling()->plaintext;
$item['company'] = $html->find('dl',$i)->next_sibling()->next_sibling()->next_sibling()->plaintext;
$item['jobdesc'] = $html->find('.jobdesc', $i)->plaintext;
$jobss[] = $item;
$i++;
}
我尝试过的代码如下:
[{
'beginDate': '2010-01-01 00:00:00',
'collectionDates': [],
'duration': 'DAILY',
'endDate': '2010-01-30 00:00:00',
'flags': [],
'stationTriplet': '302:OR:SNTL',
'values': [
Decimal('31.820'),
Decimal('27.140'),
Decimal('14.900'),
Decimal('35.600'),
Decimal('34.340'),
Decimal('31.100'),
Decimal('9.140'),
Decimal('21.380'),
Decimal('36.140'),
Decimal('28.040'),
Decimal('35.960'),
Decimal('34.700'),
Decimal('28.040'),
Decimal('25.160'),
Decimal('33.980'),
Decimal('31.640'),
Decimal('31.640'),
Decimal('29.300'),
Decimal('29.120'),
Decimal('25.880'),
Decimal('24.980'),
Decimal('21.740'),
Decimal('18.320'),
Decimal('20.480'),
Decimal('26.780'),
Decimal('28.940'),
Decimal('24.440'),
Decimal('15.440'),
Decimal('21.020'),
Decimal('31.820')
]
}]
我收到的错误消息是:
import pandas as pd
import json
with open(r'C:\Users\Anurag.Srivastava\Downloads\09386950_NM_USGS_TOBS.json', 'r') as f:
data = json.load(f)
df = pd.DataFrame(data)
答案 0 :(得分:0)
该文件不是有效的JSON数据,因此pasrser无法正确检测对象。使用任何在线JSON验证程序,例如:https://jsonlint.com/ 修复JSON后。我也建议您使用
pd.read_json(<Path>)
这种方法将以正确的方式创建数据框。
答案 1 :(得分:0)
为了使Python能够将文件视为json,需要将单引号替换为双引号,并且需要清除Decimal()
表示法。您可以执行以下操作:
import pandas as pd
import json
with open(file_name) as f:
s = f.read()
s = s.replace("'", '"')
s = s.replace('Decimal("', '')
s = s.replace('")', '')
data = json.loads(s)
for item in data:
df = pd.DataFrame(item)
然后可以创建一个索引,并可以附加相应的值,例如:
idx = pd.date_range(item['beginDate'], item['endDate'])
df = pd.DataFrame(idx)
df['values'] = item['values']