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

如何将含日期字符串列表的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

代码细节解释

  1. str.extract(r"'(.*?)'", expand=False)
    用正则表达式精准提取单引号包裹的日期时间字符串,直接去掉了列表的方括号和单引号,得到纯"2019-08-02 08:30:56"格式的字符串。这种方法比x[1:-1]更鲁棒——即使后续列表字符串格式有微小变化(比如多空格),正则也能稳定提取内容。

  2. pd.to_datetime(...)
    将提取到的字符串转换为Pandas的datetime类型,为后续截取日期做准备。

  3. .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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 03:35:18