如何循环解析值为字典的pandas列并格式化其中的时间字段
问题说明
现有Pandas DataFrame中rates列的每一行值均为字典结构,样例数据如下:
rates 0 {'time': '2022-06-05T19:25:57.3000000Z', 'asset_id_quote': '0X', 'rate': 73571.98764837519} 1 {'time': '2022-06-05T19:25:57.3000000Z', 'asset_id_quote': '18C', 'rate': 11607635.869234081} 2 {'time': '2022-06-05T19:25:57.3000000Z', 'asset_id_quote': '1EARTH', 'rate': 4162937.862828232} 3 {'time': '2022-06-05T19:25:57.3000000Z', 'asset_id_quote': '1ECO', 'rate': 7337.697146675354} 4 {'time': '2022-06-05T19:25:57.3000000Z', 'asset_id_quote': '1INCH', 'rate': 34645.31024605586} ... ... 4917 {'time': '2022-06-05T19:25:07.1000000Z', 'asset_id_quote': 'SEK', 'rate': 291937.0479618742} 4918 {'time': '2022-06-05T19:25:07.1000000Z', 'asset_id_quote': 'SGD', 'rate': 41146.239317767526} 4919 {'time': '2022-06-05T19:25:07.1000000Z', 'asset_id_quote': 'THB', 'rate': 1026548.5675256335} 4920 {'time': '2022-06-05T19:25:07.1000000Z', 'asset_id_quote': 'TRY', 'rate': 495117.01581884566} 4921 {'time': '2022-06-05T19:25:07.1000000Z', 'asset_id_quote': 'ZAR', 'rate': 463779.32985313266}
需求为通过循环方式解析该列,移除time字段中的T和Z字符,将时间格式调整为yyyy-mm-dd hh:mm:ss。
之前编写的实现代码逻辑存在错误,无法达成预期效果,错误代码如下:
def change_columns_format(self, column_in_df1): df = self.getting_response_and_df() for i in column_in_df1: for x in i: x = [x[:19].replace("T", " ") for x in i] print (i) return df
原代码错误点
- 遍历对象错误:内层循环直接遍历字典,只会拿到
time/asset_id_quote/rate三个键名,根本没有取到字典中存储的实际时间值 - 无有效写回逻辑:循环中仅对临时变量
x赋值,没有将处理后的结果写回DataFrame对应位置,原数据不会产生任何修改 - 逻辑冗余:列表推导式嵌套在内层循环中,会产生大量无意义的重复计算
循环实现方案
按照要求使用循环完成处理的代码如下:
def change_columns_format(self): df = self.getting_response_and_df() # 逐行遍历rates列,拿到行索引和对应字典 for idx, rate_item in df['rates'].items(): # 提取原始时间字符串 raw_time_str = rate_item['time'] # 截取前19位(恰好到秒级),替换T为空格,自动丢弃后面的毫秒和Z字符 formatted_time = raw_time_str[:19].replace('T', ' ') # 将处理后的时间写回原字典 df.loc[idx, 'rates']['time'] = formatted_time return df
处理后time字段格式样例:2022-06-05 19:25:57,完全符合要求。
拓展:如果后续做数据分析需要更方便的结构,也可以直接把字典结构拆成独立列,不需要循环就能快速完成格式处理:
# 将rates列的字典展开为独立列 df = pd.concat([df.drop(columns=['rates']), df['rates'].apply(pd.Series)], axis=1) # 批量处理时间格式 df['time'] = df['time'].str[:19].str.replace('T', ' ')
内容的提问来源于stack exchange,提问作者Trepetaky
相关产品推荐
相关产品推荐

