python如何将字符串转换为datetime对象_python字符串与datetime对象的相互转换

裘德小鎮的故事
发布: 2025-09-12 18:31:01
原创
1037人浏览过
Python中字符串与datetime对象互转的核心是strptime()和strftime()方法,前者按指定格式解析字符串为datetime对象,后者将datetime对象格式化为字符串。使用时需确保格式代码精确匹配,否则会抛出ValueError;对于ISO 8601格式,推荐使用更快的fromisoformat();大批量转换时可借助pandas的to_datetime()提升性能。

python如何将字符串转换为datetime对象_python字符串与datetime对象的相互转换

Python中将字符串转换为

datetime
登录后复制
对象,核心在于
datetime
登录后复制
模块的
strptime()
登录后复制
方法;反之,将
datetime
登录后复制
对象格式化为字符串,则使用
strftime()
登录后复制
方法。这两种转换都依赖于精确的格式代码,确保输入与输出的模式匹配。

在Python日常开发中,处理日期和时间几乎是家常便饭。我发现,最常见且直接的方式就是使用内置的

datetime
登录后复制
模块。它提供了
strptime()
登录后复制
(string parse time)函数,顾名思义,就是从字符串解析时间。你需要告诉它你的字符串长什么样,比如“2023-10-27 10:30:00”这种,然后提供一个对应的格式字符串,比如
"%Y-%m-%d %H:%M:%S"
登录后复制
。如果格式对不上,Python会毫不留情地抛出
ValueError
登录后复制
,所以,格式字符串的准确性是关键。

举个例子,假设我们有一个日期字符串

date_str = "2023年10月27日 10时30分05秒"
登录后复制
。要把它变成
datetime
登录后复制
对象,我会这么写:

from datetime import datetime

date_str = "2023年10月27日 10时30分05秒"
# 注意这里格式字符串要和date_str完全匹配
# %Y代表四位年份,%m代表两位月份,%d代表两位日期
# %H代表24小时制小时,%M代表分钟,%S代表秒
dt_object = datetime.strptime(date_str, "%Y年%m月%d日 %H时%M分%S秒")
print(f"转换后的datetime对象:{dt_object}")
print(f"类型:{type(dt_object)}")

# 再来一个常见的ISO格式
iso_str = "2023-10-27T10:30:05"
dt_iso = datetime.strptime(iso_str, "%Y-%m-%dT%H:%M:%S")
print(f"ISO格式转换后的datetime对象:{dt_iso}")
登录后复制

这里面,每一个百分号开头的代码都有其特定含义,比如

%Y
登录后复制
是四位年份,
%m
登录后复制
是两位月份,
%d
登录后复制
是两位日期。这些格式代码是理解和使用
strptime()
登录后复制
的关键。我个人觉得,最容易出错的地方就是格式字符串和实际字符串不匹配,哪怕是多一个空格,少一个标点符号,都会导致转换失败。所以,在写代码的时候,我总是会先仔细检查一下输入字符串的精确格式。

立即学习Python免费学习笔记(深入)”;

Python中如何将datetime对象格式化为特定字符串?

datetime
登录后复制
对象转换回字符串,通常是为了展示、存储到数据库或者作为API响应。这比字符串转
datetime
登录后复制
要“舒服”得多,因为你完全掌控了输出的格式。我们使用
datetime
登录后复制
对象的
strftime()
登录后复制
(string format time)方法,它也需要一个格式字符串作为参数,来告诉Python你希望日期时间以何种形式呈现。

比如,你可能希望日期是“2023/10/27”,或者“October 27, 2023”。这完全取决于你的需求。

from datetime import datetime

# 假设我们有一个datetime对象
now = datetime.now()
print(f"当前的datetime对象:{now}")

# 格式化为常见的日期字符串
formatted_date = now.strftime("%Y-%m-%d")
print(f"格式化为'年-月-日':{formatted_date}")

# 格式化为包含时间的字符串
formatted_datetime = now.strftime("%Y/%m/%d %H:%M:%S")
print(f"格式化为'年/月/日 时:分:秒':{formatted_datetime}")

# 格式化为更友好的中文表示
chinese_datetime = now.strftime("今天是%Y年%m月%d日,现在是%H点%M分。")
print(f"格式化为中文表示:{chinese_datetime}")

# 更多格式代码的组合
full_string = now.strftime("%A, %B %d, %Y %I:%M:%S %p")
print(f"完整日期时间表示:{full_string}") # 例如:Friday, October 27, 2023 10:30:05 AM
登录后复制

strftime()
登录后复制
的灵活性在于你可以用各种格式代码组合出你想要的任何字符串样式。我经常用它来生成日志文件名,或者在网页上显示用户友好的时间戳。它几乎不会出错,只要你提供的格式代码是有效的,它就能给你一个字符串。

Python字符串转datetime时常见的陷阱与错误处理?

在将字符串转换为

datetime
登录后复制
对象时,我遇到过最多的问题就是
ValueError
登录后复制
。这通常是因为:

  1. 格式不匹配:这是最常见的。比如你的字符串是
    "2023-10-27"
    登录后复制
    ,但你用了
    "%Y/%m/%d"
    登录后复制
    去解析,斜杠和横杠不一致,就报错了。
  2. 非法日期:比如尝试解析
    "2023-02-30"
    登录后复制
    (二月没有30号),这也会导致
    ValueError
    登录后复制
  3. 时区信息:如果字符串中包含时区信息,比如
    "2023-10-27T10:30:00+08:00"
    登录后复制
    ,而你的格式字符串没有相应地处理时区(例如
    %z
    登录后复制
    ),也会有问题。

为了让代码更健壮,尤其是在处理用户输入或外部数据时,我强烈建议使用

try-except
登录后复制
块来捕获这些潜在的
ValueError
登录后复制

快转字幕
快转字幕

新一代 AI 字幕工作站,为创作者提供字幕制作、学习资源、会议记录、字幕制作等场景,一键为您的视频生成精准的字幕。

快转字幕 357
查看详情 快转字幕
from datetime import datetime

def safe_str_to_datetime(date_string, format_string):
    try:
        dt_obj = datetime.strptime(date_string, format_string)
        return dt_obj
    except ValueError as e:
        print(f"转换失败:'{date_string}' 与格式 '{format_string}' 不匹配或日期无效。错误信息:{e}")
        return None

# 尝试一个正确的转换
dt1 = safe_str_to_datetime("2023-10-27", "%Y-%m-%d")
if dt1:
    print(f"成功转换:{dt1}")

# 尝试一个格式不匹配的转换
dt2 = safe_str_to_datetime("2023/10/27", "%Y-%m-%d")
if dt2:
    print(f"成功转换:{dt2}") # 这行不会执行

# 尝试一个非法日期的转换
dt3 = safe_str_to_datetime("2023-02-30", "%Y-%m-%d")
if dt3:
    print(f"成功转换:{dt3}") # 这行也不会执行
登录后复制

有时候,我们可能面对多种可能的日期格式。在这种情况下,可以尝试按顺序用不同的格式字符串去解析,直到成功为止。但如果格式种类太多,或者完全不确定,可以考虑使用第三方库,比如

dateutil
登录后复制
parser
登录后复制
模块。它非常智能,能够猜测日期字符串的格式,但我也提醒自己,过度依赖这种“猜测”有时会带来意想不到的错误,尤其是在数据模糊不清时。它可能把"01/02/2023"解析成1月2日,也可能是2月1日,这取决于它的内部逻辑和默认设置。所以,如果能明确格式,还是尽量明确。

在Python中进行大量日期时间转换时,如何优化性能?

当我处理大量数据,比如从CSV文件读取成千上万行带有日期时间字符串的数据时,性能就成了我必须考虑的问题。反复调用

strptime()
登录后复制
可能会成为瓶颈。

  1. 预编译格式字符串

    strptime()
    登录后复制
    在每次调用时都需要解析格式字符串。如果你在循环中反复使用同一个格式字符串,Python可能会在内部重复做一些工作。虽然Python解释器通常会做一些优化,但如果性能要求非常高,可以考虑其他方法。不过,对于大多数应用来说,
    strptime()
    登录后复制
    的性能已经足够了。

  2. 使用

    datetime.fromisoformat()
    登录后复制
    处理ISO 8601格式:如果你的日期时间字符串是标准的ISO 8601格式(例如
    "YYYY-MM-DDTHH:MM:SS"
    登录后复制
    "YYYY-MM-DD HH:MM:SS"
    登录后复制
    ),那么
    datetime
    登录后复制
    对象自带的
    fromisoformat()
    登录后复制
    方法会比
    strptime()
    登录后复制
    更快、更简洁。它不需要你提供格式字符串,因为它就是为这种特定格式设计的。

    from datetime import datetime
    
    iso_str = "2023-10-27T10:30:05.123456"
    dt_obj_iso = datetime.fromisoformat(iso_str)
    print(f"使用fromisoformat转换:{dt_obj_iso}")
    登录后复制

    它甚至能处理微秒,非常方便。

  3. 利用

    pandas
    登录后复制
    库进行批量转换:如果你的数据量真的很大,并且已经在使用
    pandas
    登录后复制
    处理数据,那么
    pandas
    登录后复制
    提供了一个非常高效的
    pd.to_datetime()
    登录后复制
    函数。它不仅速度快,还能智能地处理多种日期格式,甚至可以并行处理,并且能方便地处理错误(例如,将无法解析的日期转换为
    NaT
    登录后复制
    ,即"Not a Time")。

    import pandas as pd
    
    date_strings = ["2023-10-27", "2023/11/15", "invalid-date", "2024-01-01 12:00:00"]
    s = pd.Series(date_strings)
    
    # errors='coerce' 会将无法解析的日期转换为NaT
    # infer_datetime_format=True 可以让pandas尝试推断格式,提高速度
    dt_series = pd.to_datetime(s, errors='coerce', infer_datetime_format=True)
    print(f"使用pandas批量转换:\n{dt_series}")
    登录后复制

    在处理数据框架时,

    pd.to_datetime()
    登录后复制
    是我的首选工具,它极大地简化了日期时间处理的复杂性,并且性能表现优异。

总的来说,选择哪种方法取决于你的具体场景:单个转换、已知格式、未知格式、错误处理需求以及数据量大小。了解这些工具的优缺点,可以帮助我们更高效、更健壮地处理Python中的日期时间转换问题。

以上就是python如何将字符串转换为datetime对象_python字符串与datetime对象的相互转换的详细内容,更多请关注php中文网其它相关文章!

python速学教程(入门到精通)
python速学教程(入门到精通)

python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号