Pandas中Timestamp列表序列化后反序列化失败求助
解决Timestamp列表序列化后转字符串的提取与转换问题
问题分析
你遇到的核心问题是正则表达式匹配错误,以及extractall的用法不适合当前场景:
- 原正则仅匹配单个数字的年/月/日,无法覆盖
YYYY-MM-DD格式的日期 - 未转义正则中的特殊字符(括号),导致匹配失效
extractall返回的是结构化DataFrame,不如str.findall直接返回匹配列表便捷
解决方案
以下是修正后的代码步骤:
- 导入依赖
import pandas as pd
- 示例DataFrame
df = pd.DataFrame({'col':["[]", "[Timestamp('2018-04-24 00:00:00'), Timestamp('2018-05-14 00:00:00'), Timestamp('2018-05-14 00:00:00')]"]})
- 提取日期字符串列表
使用修正后的正则,通过str.findall批量提取每个单元格中的所有时间字符串:
df['time_list'] = df['col'].str.findall(r"Timestamp\('(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})'\)")
- 正则解释:
Timestamp\('匹配固定前缀,(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})捕获完整的日期时间字符串,'\)匹配后缀
- 转换为Timestamp列表
用apply将字符串列表批量转为Timestamp对象列表:
df['time_list'] = df['time_list'].apply(lambda lst: [pd.to_datetime(t) for t in lst])
验证结果
print(df['time_list'][0]) # 输出:[] print(df['time_list'][1]) # 输出:[Timestamp('2018-04-24 00:00:00'), Timestamp('2018-05-14 00:00:00'), Timestamp('2018-05-14 00:00:00')]
预防方案(避免后续踩坑)
下次序列化DataFrame时,建议用JSON格式存储时间列表,避免正则匹配的麻烦:
- 存储时:
import json df['col'] = df['col'].apply(lambda lst: json.dumps([t.isoformat() for t in lst])) df.to_csv('data.csv', index=False)
- 读取时:
df = pd.read_csv('data.csv') df['col'] = df['col'].apply(lambda s: [pd.to_datetime(t) for t in json.loads(s)])
内容的提问来源于stack exchange,提问作者Nicolas
相关产品推荐
相关产品推荐

