如何将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:修正正则表达式
如果你坚持要用正则,需要解决两个核心问题:
- 原正则
(\d+\.\d+\.\d+)完全错误——你的时间戳用连字符-分隔日期,不是点.,而且没匹配完整的时间+时区部分 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
相关产品推荐
相关产品推荐

