Pandas DataFrame转JSON后导入MongoDB遇解码错误求助
解决MongoDB导入Pandas生成的JSON文件报错问题
我来帮你分析一下问题所在,以及如何解决:
问题根源
你当前的代码犯了一个小错误:df.to_json(orient='index')已经生成了一个合法的JSON字符串,但你紧接着又用json.dump(xx, outfile)把这个字符串当作普通文本写入文件。这会导致最终的JSON文件内容是一个被双引号包裹的长字符串(相当于把JSON转义了),而不是MongoDB期望的JSON对象结构,所以mongoimport无法正确解析。
解决方案一:直接写入DataFrame生成的JSON
最简单的方法是跳过中间的json模块调用,直接让Pandas把JSON写入文件:
import pandas as pd df = pd.DataFrame([[1, 2], [3, 4]], index=['2018-03-27 09:30:00', '2018-03-27 09:31:00'], columns=['UNH', 'V']) # 直接生成并写入JSON文件,orient='index'保持你的原有结构 df.to_json('x_try.json', orient='index', indent=2)
此时文件里的内容是标准的JSON对象:
{ "2018-03-27 09:30:00": { "UNH": 1, "V": 2 }, "2018-03-27 09:31:00": { "UNH": 3, "V": 4 } }
然后直接用你最初的mongoimport命令即可成功导入:
mongoimport --db db_name --collection c_name --file x_try.json
解决方案二:先解析JSON字符串再写入
如果你一定要使用json模块,需要先把Pandas生成的JSON字符串解析成Python字典,再写入文件:
import pandas as pd import json df = pd.DataFrame([[1, 2], [3, 4]], index=['2018-03-27 09:30:00', '2018-03-27 09:31:00'], columns=['UNH', 'V']) xx = df.to_json(orient='index') # 将JSON字符串解析为Python字典 data_dict = json.loads(xx) with open('x_try.json', 'w') as outfile: json.dump(data_dict, outfile, indent=2)
这样得到的文件内容和方案一完全一致,同样可以用原命令导入。
更推荐的MongoDB文档结构
另外,从MongoDB的使用习惯来说,把每个时间点的数据作为一个独立文档会更便于查询和操作。你可以调整Pandas的输出格式:
import pandas as pd df = pd.DataFrame([[1, 2], [3, 4]], index=['2018-03-27 09:30:00', '2018-03-27 09:31:00'], columns=['UNH', 'V']) # 将索引转为普通列,并命名为timestamp df.reset_index(inplace=True) df.rename(columns={'index': 'timestamp'}, inplace=True) # 生成JSON数组格式的文件 df.to_json('x_try.json', orient='records', indent=2)
此时文件内容是JSON数组:
[ { "timestamp": "2018-03-27 09:30:00", "UNH": 1, "V": 2 }, { "timestamp": "2018-03-27 09:31:00", "UNH": 3, "V": 4 } ]
导入时需要加上--jsonArray选项:
mongoimport --db db_name --collection c_name --file x_try.json --jsonArray
这样每个时间点的数据都会成为MongoDB集合中的一个单独文档,后续查询特定时间或字段会更灵活。
内容的提问来源于stack exchange,提问作者Ale
相关产品推荐
相关产品推荐

