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

如何将Pandas中包含起止时间的结构体格式timestamp列转换为常规时间戳列?

解决方案

方法1:解析JSON字符串(推荐)

你的timestamp列是标准的JSON格式字符串,直接用JSON解析是最稳妥的方式,比正则表达式更可靠,不会因为格式小变化出错:

import pandas as pd
import json

# 原数据
df = pd.DataFrame({'timestamp': ['{"start":"2022-01-19T00:00:00.000+0000","end":"2022-01-20T00:00:00.000+0000"}'], "X1": [25], "X2": [33], })

# 步骤1:将timestamp列的每个字符串转为JSON对象
json_records = df['timestamp'].apply(json.loads).tolist()

# 步骤2:解析JSON为DataFrame并合并到原表
df = df.join(
    pd.json_normalize(json_records)
    .rename(columns={'start': 'start_timestamp', 'end': 'end_timestamp'})
)

print(df)

运行后会得到你期望的结果:

timestamp               start_timestamp                 end_timestamp  X1  X2
0  {"start":"2022-01-19T00:00:00.000+0000","end":"2022-01-20T00:00:00.000+0000"}  2022-01-19T00:00:00.000+0000  2022-01-20T00:00:00.000+0000  25  33

方法2:修正正则表达式

如果你坚持要用正则,需要解决两个核心问题:

  1. 原正则(\d+\.\d+\.\d+)完全错误——你的时间戳用连字符-分隔日期,不是点.,而且没匹配完整的时间+时区部分
  2. str.extractall会返回多行结果,导致结构不匹配,改用str.extract即可匹配单行的两个捕获组

修正后的代码:

import pandas as pd

df = pd.DataFrame({'timestamp': ['{"start":"2022-01-19T00:00:00.000+0000","end":"2022-01-20T00:00:00.000+0000"}'], "X1": [25], "X2": [33], })

# 用extract匹配两个捕获组,分别对应start和end的时间戳
df[['start_timestamp', 'end_timestamp']] = df['timestamp'].str.extract(r'"start":"([^"]+)","end":"([^"]+)"')

print(df)

为什么你的原代码报错?

你用extractall会返回一个带有多层索引的DataFrame,unstack()之后的列数和你要赋值的["start_timestamp", "end_timestamp"]长度不匹配,再加上正则根本没匹配到有效内容,最终触发ValueError: Columns must be same length as key。

内容的提问来源于stack exchange,提问作者Mario

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 12:57:39