You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何循环解析值为字典的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 06:21:19