Pandas DataFrame转指定嵌套字典:datetime格式异常及实现方案
Pandas DataFrame转指定嵌套字典的问题与解决
原始DataFrame结构
day account_id balance 2022-11-01 ncw8y7 1.000000 2022-11-02 ncw8y7 1.000424
预期嵌套字典结构
{"account_id":"ncw8y7","balances":{"2022-11-01":{"day":[2022,11,1],"balance":1.000000},"2022-11-02":{"day":[2022,11,2],"balance":1.000424}}}
尝试代码及问题
尝试了以下代码:
dict = results.groupby('account_id')[['day','balance']].apply(lambda x: x.set_index('day').to_dict(orient='index')).to_dict()
遇到的问题:
- 日期键为
datetime.date类型(如datetime.date(2022, 11, 1)),不是预期的字符串格式 - 结构不符合要求:缺少二级键
"balances",且day字段未拆分为[年,月,日]列表
问题原因
是的,设置day为索引时,如果原始day列是datetime/date类型,索引会保留该类型,不会自动转为字符串。同时原代码的分组逻辑直接生成了以account_id为键、日期索引字典为值的结构,没有添加"balances"二级键,也未处理day的拆分逻辑。
修改后的代码方案
方案一:分组自定义处理函数
import pandas as pd # 确保day列是datetime类型(若原始数据不是则执行此步) results['day'] = pd.to_datetime(results['day']) # 定义分组处理函数 def process_account_group(group): balances = {} for _, row in group.iterrows(): date_str = row['day'].strftime('%Y-%m-%d') day_list = [row['day'].year, row['day'].month, row['day'].day] balances[date_str] = { 'day': day_list, 'balance': row['balance'] } return {'account_id': group['account_id'].iloc[0], 'balances': balances} # 执行分组转换 final_dict = results.groupby('account_id').apply(process_account_group).iloc[0]
方案二:简洁字典推导式(单账号场景)
如果数据中只有单个account_id,可直接遍历行生成结构:
import pandas as pd results['day'] = pd.to_datetime(results['day']) final_dict = { 'account_id': results['account_id'].iloc[0], 'balances': { row['day'].strftime('%Y-%m-%d'): { 'day': [row['day'].year, row['day'].month, row['day'].day], 'balance': row['balance'] } for _, row in results.iterrows() } }
关键说明
- 先将
day转为datetime类型,方便提取年/月/日以及格式化字符串 - 手动构建
balances字典,确保日期键为YYYY-MM-DD格式的字符串 - 按要求拆分日期为[年,月,日]列表,同时保留原始balance值
- 包裹顶层的
account_id和二级键balances,匹配预期结构
内容的提问来源于stack exchange,提问作者Agnes
相关产品推荐
相关产品推荐

