我有一个这样的词典列表:
[{'accounts': [{'account_number': 'xx6747',
'bank_name': 'Fargo Bank',
'bankid': 85,
'created_date_y': Timestamp('2015-05-20 08:08:33'),
'item_account_id': 20086385.0,
'item_id': 17764259,
'user_id': 18},
{'account_number': '*819',
'bank_name': 'Central Alabama - Bank',
'bankid': 88,
'created_date_y': Timestamp('2015-05-20 08:08:33'),
'item_account_id': 20637127.0,
'item_id': 17761624,
'user_id': 18},
{'account_number': '*056',
'bank_name': 'Central Alabama - Bank',
'bankid': 88,
'created_date_y': Timestamp('2015-05-20 08:08:33'),
'item_account_id': 20087284.0,
'item_id': 17761624,
'user_id': 18},
'created_date_x': Timestamp('2014-03-11 10:48:42'),
'id': 18,
'password': 'NjgrUW9URGZz09',
'status': 1,
'uid': 97560,
'username': 'pepass@yahoo.com'},
{'accounts': [{'account_number': 791,
'bank_name': 'Chase - Bank',
'bankid': 855,
'created_date_y': Timestamp('2015-05-20 08:03:37'),
'item_account_id': 20090104.0,
'item_id': 17764260,
'user_id': 20},
{'account_number': 883,
'bank_name': 'Chase - Bank',
'bankid': 852,
'created_date_y': Timestamp('2015-05-20 08:03:37'),
'item_account_id': 20090105.0,
'item_id': 17764260,
'user_id': 20}],
'created_date_x': Timestamp('2014-03-11 13:42:20'),
'id': 20,
'password': 'bmJlbTN5dFo5QT09',
'status': 1,
'uid': 99408,
'username': 'hor@sanstore.com'}]
它还包含其他项目。 created_date_x
和created_date_y
是时间戳。 我想将此列表转换为嵌套字典,如下所示:
{'id': 18,
'password': 'NjgrUW9URGZz09',
'status': 1,
'uid': 97560,
'username': 'pepass@yahoo.com'},
'created_date_x': Timestamp('2014-03-11 10:48:42')
{'accounts':
[{'account_number': 'xx6747',
'bank_name': 'Fargo Bank',
'bankid': 85,
'created_date_y': Timestamp('2015-05-20 08:08:33'),
'item_account_id': 20086385.0,
'item_id': 17764259,
'user_id': 18},
{'account_number': '*819',
'bank_name': 'Central Alabama - Bank',
'bankid': 88,
'created_date_y': Timestamp('2015-05-20 08:08:33'),
'item_account_id': 20637127.0,
'item_id': 17761624,
'user_id': 18},
{'account_number': '*056',
'bank_name': 'Central Alabama - Bank',
'bankid': 88,
'created_date_y': Timestamp('2015-05-20 08:08:33'),
'item_account_id': 20087284.0,
'item_id': 17761624,
'user_id': 18}]}}
将其转换为字典后,我想将其转换为JSON。将其转换为json的问题是timestamp
字段的错误为timestamp is not json serializale
。到目前为止,我所使用的代码无法正常工作:
import pandas as pd
#importing files
df1 = pd.read_excel("C:\\Users\\Desktop\\yod_user.xlsx")
df2 = pd.read_excel("C:\\Users\\Desktop\\yod_bank.xlsx")
df1['created_date'] = df1['created_date'].astype(str)
df2['created_date'] = df2['created_date'].astype(str)
df1.dtypes
#id int64
#username object
#password object
#uid int64
#created_date object
#status int64
#dtype: object
df2.dtypes
#user_id int64
#bankid int64
#account_number object
#item_id int64
#item_account_id float64
#created_date object
#bank_name object
#dtype: object
df_merge = pd.merge(df1, df2, left_on = 'id', right_on ='user_id', how ='inner')
df_merge.dtypes
#id object
#username object
#password object
#uid object
#created_date_x object
#status object
#user_id object
#bankid object
#account_number object
#item_id object
#item_account_id object
#created_date_y object
#bank_name object
#dtype: object
j = df_merge.groupby(['id', 'username', 'password', 'uid',created_date_x', 'status'], as_index=False)\
.apply(lambda x: x[['account_number','user_id','bankid', 'item_id', 'item_account_id','created_date_y', 'bank_name' ]].to_dict('r'))\
.reset_index()\
.rename(columns={0:'accounts'})\
j.dtypes
#id int64
#username object
#password object
#uid int64
#created_date_x object
#status int64
#accounts object
#dtype: object
jdict = j.to_dict('records')
import json
json.dumps(jdict) #This gives an error: TypeError: Object of type 'Timestamp' is not JSON serializable
如果初始列表可以转换为json,就像字典那样也可以。请帮助。
答案 0 :(得分:0)
使用astype()
将有效。在您的代码中,您实际上并未更改日期列的dtype
。
你有:
df1['created_date'].astype(str)
你需要:
df1['created_date'] = df1['created_date'].astype(str)
示例:
dates = pd.date_range("2000","2002",freq="A")
data = {"created_date":dates, "value":range(len(dates))}
df = pd.DataFrame(data)
df
created_date value
0 2000-12-31 0
1 2001-12-31 1
(df["created_date"].dtype
# datetime64[ns]
df["created_date"] = df["created_date"].astype(str)
df["created_date"].dtype
# object
json.dumps(df.to_dict('records'))
# '[{"created_date": "2000-12-31", "value": 0},
{"created_date": "2001-12-31", "value": 1}]'
答案 1 :(得分:0)
解决此问题的一个简单方法是避免完全使用Timestamp
。您可以改为使用内置的Timestamp
模块而不是调用datetime
,而是创建一个返回实际数字时间戳的函数。例如
from datetime import datetime
from pytz import utc
def timestamp_from_str(date_str):
date = datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S')
return date.replace(tzinfo=utc).timestamp()
请注意,{2.7}中没有.timestamp
方法,在这种情况下,您必须手动计算时间戳。这是一个简单的过程,但我在这里没有提到它,因为another question已经对它进行了深入的描述。