Python 用u';和十进制值

Python 用u';和十进制值,python,json,string,pandas,dataframe,Python,Json,String,Pandas,Dataframe,我需要解码并加载到DB,这是一个以以下格式到达的字符串: "[{u'date': 1508760000000, u'value': 0}, {u'date': 1509364800000, u'value': Decimal('5.989999771118164')}, {u'date': 1509969600000, u'value': Decimal('5.989999771118164')}, {u'date': 1510574400000, u'value': Decimal('9.57

我需要解码并加载到DB,这是一个以以下格式到达的字符串:

"[{u'date': 1508760000000, u'value': 0}, {u'date': 1509364800000, u'value': Decimal('5.989999771118164')}, {u'date': 1509969600000, u'value': Decimal('5.989999771118164')}, {u'date': 1510574400000, u'value': Decimal('9.579999923706055')}]"
目前,我使用以下代码将其转换为数据帧:

import pandas as pd
import json

#json for example:
my_json="""[{u'date': 1508760000000, u'value': 0}, {u'date': 1509364800000, u'value': Decimal('5.989999771118164')}, {u'date': 1509969600000, u'value': Decimal('5.989999771118164')}, {u'date': 1510574400000, u'value': Decimal('9.579999923706055')}]"""
my_json=my_json[1:-1]
my_json=my_json.replace("u'","'")
my_json=my_json.replace("'",'"')
my_json=my_json.replace('Decimal("','')
my_json=my_json.replace('")','')
my_json=my_json.replace(', {','~ {')
my_json_list=my_json.split('~')
my_dict_list=[json.loads(row) for row in my_json_list]
df=pd.DataFrame(my_dict_list)

有没有一种更短/更优雅的方法来执行此操作?

u表示unicode-但是如果您的所有字符都是基于ascii的-就像英语一样,您可以使用casting
str()
,下面是它的输出:

str(u'date')
'date'

我想它会解决你的问题。

u表示unicode,但如果你所有的字符都是基于ascii的,就像英语一样,你可以使用casting
str()
,下面是它的输出:

str(u'date')
'date'

我想它会解决你的问题。

使用
eval

from decimal import *
df = pd.DataFrame(eval(my_json))

           date              value
0  1508760000000                  0
1  1509364800000  5.989999771118164
2  1509969600000  5.989999771118164
3  1510574400000  9.579999923706055

使用
eval

from decimal import *
df = pd.DataFrame(eval(my_json))

           date              value
0  1508760000000                  0
1  1509364800000  5.989999771118164
2  1509969600000  5.989999771118164
3  1510574400000  9.579999923706055


您提供的字符串不是有效的
json
,因为它以列表开头。该字符串来自何处?它看起来像是从python
列表的
print
(每个字符串前面的
u
表示它是unicode字符串)复制而来的,实际上不是有效的JSON。您可以使用
ast
将字符串转换为文本结构,如下所示:
import ast;ast.literal\u eval(string)
但在您的情况下,您有十进制对象,但它不起作用,但您可以在解决问题的地方检查它。@KaushikNP:为什么这会使它无效?您是否会声明字符串
“[1,2,3]”
是无效的JSON?(我同意该字符串不是有效的JSON,但它在顶级是JSON数组没有问题。)@MarkDickinson:正如你提到的,我的意思是它应该被分类为JSONArray。你提供的字符串不是有效的
JSON
,因为它以列表开头。该字符串来自哪里?它看起来像是从python
列表的
print
(每个字符串前面的
u
表示它是unicode字符串)复制而来的,实际上不是有效的JSON。您可以使用
ast
将字符串转换为文本结构,如下所示:
import ast;ast.literal\u eval(string)
但在您的情况下,您有十进制对象,但它不起作用,但您可以在解决问题的地方检查它。@KaushikNP:为什么这会使它无效?您是否会声明字符串
“[1,2,3]”
是无效的JSON?(我同意字符串不是有效的JSON,但它在顶级是JSON数组没有问题。)@MarkDickinson:正如你提到的,我的意思是它应该被分类为JSONArray。
来自decimal import*
很聪明;)<代码>从十进制导入十进制
将是足够的,但此字符串需要作为数据导入问题在于通过打印dict列表导出数据…@JohannesReichard我没有收到您的信息。因为这是一个大熊猫问题,我认为所有的OP都应该得到数据帧作为输出。因为我只看到了部分字符串,所以我导入了所有内容以避免将来出现问题。我正要建议
ast.literal\u eval
,但我想字符串确实包含
Decimal
…呵呵,我只是在答案中添加了另一条注释以添加更多上下文。您的回答完美地解决了这个问题,但我认为还有另一个问题:您不应该使用需要使用
eval
to读取的python代码作为数据交换格式。如果它是一次性的,只需为它创建真正的变量。如果是在生产中使用的代码,请不要在没有其他提示的情况下使用eval,请更改数据交换格式。
从十进制导入*
是聪明的;)<代码>从十进制导入十进制
将是足够的,但此字符串需要作为数据导入问题在于通过打印dict列表导出数据…@JohannesReichard我没有收到您的信息。因为这是一个大熊猫问题,我认为所有的OP都应该得到数据帧作为输出。因为我只看到了部分字符串,所以我导入了所有内容以避免将来出现问题。我正要建议
ast.literal\u eval
,但我想字符串确实包含
Decimal
…呵呵,我只是在答案中添加了另一条注释以添加更多上下文。您的回答完美地解决了这个问题,但我认为还有另一个问题:您不应该使用需要使用
eval
to读取的python代码作为数据交换格式。如果它是一次性的,只需为它创建真正的变量。如果它是在生产中使用的代码,永远不要使用eval而没有额外的感知,请更改您的数据交换格式^^。但是
str(“u'date”)
仍然是
“u'date”
。我在Python2.7中尝试过它,str(“u'date”)只是“date”,那么您的数据交换格式并不是真正的Python2.7,或者您并没有真正测试它。但是
str(“u'date”)
仍然是
“u'date”
。我在Python2.7中尝试过,str(“u'date”)只是“date”,那么您的不是真正的Python2.7,或者您没有真正测试它。