如何将含日期字符串列表的DataFrame列转换为纯日期格式?
一步完成DataFrame中字符串日期列表的格式转换
核心解决方案(矢量化高效版)
针对你的需求,我们可以用正则提取+日期转换的矢量化操作一步完成所有处理,比逐行apply效率更高,鲁棒性也更强:
import pandas as pd # 示例数据初始化 data = [[1, ["2019-08-02 08:30:56"]], [2, ["2020-08-02 08:30:56"]]] df = pd.DataFrame(data, columns=["items", "dates"]) df["dates"] = df["dates"].astype(str) # 一步完成:去列表括号+转日期格式+去除时间戳 df["dates"] = pd.to_datetime(df["dates"].str.extract(r"'(.*?)'", expand=False)).dt.date.astype(str)
执行后得到的结果就是你需要的目标数据集:
items dates 0 1 2019-08-02 1 2 2020-08-02
代码细节解释
str.extract(r"'(.*?)'", expand=False)
用正则表达式精准提取单引号包裹的日期时间字符串,直接去掉了列表的方括号和单引号,得到纯"2019-08-02 08:30:56"格式的字符串。这种方法比x[1:-1]更鲁棒——即使后续列表字符串格式有微小变化(比如多空格),正则也能稳定提取内容。pd.to_datetime(...)
将提取到的字符串转换为Pandas的datetime类型,为后续截取日期做准备。.dt.date.astype(str)
从datetime对象中提取纯日期部分,再转换为字符串类型,最终得到YYYY-MM-DD格式的日期。
备选方案(兼容多元素列表场景)
如果你的dates列可能存在包含多个日期的列表字符串(比如['2019-08-02','2019-08-03']),可以先把字符串转回列表再处理:
from ast import literal_eval df["dates"] = pd.to_datetime(df["dates"].apply(literal_eval).str[0]).dt.date.astype(str)
这里literal_eval会把字符串化的列表转回真正的列表对象,str[0]取第一个日期元素,后续步骤和之前一致。不过这种方法是逐行处理,数据量大时效率不如矢量化的正则提取。
对比原方法的优势
你原来的lambda x: x[1:-1]只能简单截取字符串首尾,但:
- 无法处理列表字符串格式异常的情况(比如首尾有空格);
- 后续还需要单独做日期转换和时间戳去除,步骤繁琐;
- 逐行
apply的效率远低于Pandas的矢量化字符串操作。
内容的提问来源于stack exchange,提问作者user
相关产品推荐
相关产品推荐

