python处理日期时间数据的核心在于使用datetime模块。1.datetime模块提供了date、time、datetime、timedelta和tzinfo等关键类,用于创建、操作和格式化日期时间。2.可通过datetime.now()获取当前日期时间,或通过指定参数构建特定日期时间对象。3.使用strftime方法按格式代码将datetime对象格式化为字符串,如%y-%m-%d %h:%m:%s。4.使用strptime方法将字符串解析为datetime对象,但格式字符串必须严格匹配输入。5.timedelta用于表示时间差,支持日期时间的加减运算,如计算未来或过去的时间点。6.处理时区时推荐使用pytz库,它提供了完整的时区支持,包括夏令时自动调整。7.datetime对象可直接比较和排序,内部基于时间点进行判断。8.常见陷阱包括混淆天真与感知日期时间、strptime格式不匹配以及夏令时处理问题。9.性能优化包括避免不必要的datetime对象创建、使用time.time()获取时间戳,以及在批量处理时使用pandas等高效库。

Python处理日期时间数据,核心在于使用其内置的
datetime

datetime
date
time
datetime
timedelta
tzinfo
创建日期时间对象
立即学习“Python免费学习笔记(深入)”;

最常见的,我们可能需要获取当前日期时间,或者根据特定值构建一个。
from datetime import date, time, datetime, timedelta, timezone
# 获取当前日期时间
now = datetime.now()
print(f"当前日期时间: {now}") # 包含微秒
# 获取今天的日期
today = date.today()
print(f"今天的日期: {today}")
# 构建特定日期时间
# 2023年10月26日 下午3点30分0秒
specific_dt = datetime(2023, 10, 26, 15, 30, 0)
print(f"特定日期时间: {specific_dt}")
# 构建特定日期
specific_date = date(2024, 1, 1)
print(f"特定日期: {specific_date}")
# 构建特定时间
specific_time = time(9, 15, 45)
print(f"特定时间: {specific_time}")访问日期时间组件

创建了
datetime
dt = datetime(2023, 10, 26, 15, 30, 0, 123456)
print(f"年份: {dt.year}")
print(f"月份: {dt.month}")
print(f"日期: {dt.day}")
print(f"小时: {dt.hour}")
print(f"分钟: {dt.minute}")
print(f"秒数: {dt.second}")
print(f"微秒: {dt.microsecond}")
print(f"星期几 (0=周一, 6=周日): {dt.weekday()}")
print(f"ISO 星期几 (1=周一, 7=周日): {dt.isoweekday()}")格式化日期时间 (strftime
将
datetime
strftime()
dt = datetime.now()
# 常用格式
print(f"标准日期时间: {dt.strftime('%Y-%m-%d %H:%M:%S')}")
print(f"中文日期时间: {dt.strftime('%Y年%m月%d日 %H时%M分%S秒')}")
print(f"只显示日期: {dt.strftime('%x')}") # 等同于 %m/%d/%y 或 %d/%m/%y 取决于系统 locale
print(f"只显示时间: {dt.strftime('%X')}") # 等同于 %H:%M:%S 或 %I:%M:%S %p 取决于系统 locale
print(f"星期几全称: {dt.strftime('%A')}") # 例如 'Thursday'
print(f"一年中的第几天: {dt.strftime('今天是今年的第%j天')}")我个人觉得,
%Y-%m-%d %H:%M:%S
解析日期时间字符串 (strptime
反过来,将一个日期时间字符串解析成
datetime
strptime()
date_str1 = "2023-10-26 15:30:00"
dt1 = datetime.strptime(date_str1, "%Y-%m-%d %H:%M:%S")
print(f"解析字符串1: {dt1}")
date_str2 = "Oct 26, 2023 3:30 PM"
# 注意这里的小时是12小时制,需要用 %I 和 %p
dt2 = datetime.strptime(date_str2, "%b %d, %Y %I:%M %p")
print(f"解析字符串2: {dt2}")
# 错误示例:格式不匹配会抛出 ValueError
try:
datetime.strptime("2023/10/26", "%Y-%m-%d")
except ValueError as e:
print(f"解析错误: {e}")时间差计算 (timedelta
timedelta
# 创建一个时间差
one_day = timedelta(days=1)
one_hour = timedelta(hours=1)
ten_minutes = timedelta(minutes=10)
dt_now = datetime.now()
print(f"当前时间: {dt_now}")
# 未来一天
dt_tomorrow = dt_now + one_day
print(f"明天: {dt_tomorrow}")
# 过去两小时
dt_two_hours_ago = dt_now - timedelta(hours=2)
print(f"两小时前: {dt_two_hours_ago}")
# 计算两个日期时间之间的差值
dt_past = datetime(2023, 10, 1, 10, 0, 0)
time_diff = dt_now - dt_past
print(f"时间差: {time_diff}")
print(f"时间差的总秒数: {time_diff.total_seconds()}")
print(f"时间差的天数: {time_diff.days}")用
timedelta
处理时区问题,尤其是涉及到跨地域或夏令时(DST)的场景,是日期时间操作里一个不小的挑战。
datetime
tzinfo
pytz
pytz
说白了,Python内置的
tzinfo
pytz
核心概念:天真(Naive)与感知(Aware)日期时间
在深入之前,得先搞清楚两个概念:
datetime
datetime(2023, 10, 26, 15, 30)
datetime
天真日期时间在只涉及本地时间且不跨时区计算时没问题,但一旦需要跨时区转换或考虑夏令时,就必须使用感知日期时间。
使用 pytz
首先,你需要安装
pytz
pip install pytz
import pytz
from datetime import datetime
# 1. 获取一个时区对象
tz_utc = pytz.utc
tz_london = pytz.timezone('Europe/London')
tz_shanghai = pytz.timezone('Asia/Shanghai')
# 2. 创建一个带时区的datetime对象
# 推荐做法:先创建UTC时间,再转换为目标时区
dt_utc_now = datetime.now(tz_utc)
print(f"UTC 当前时间: {dt_utc_now}")
# 或者,创建一个天真datetime,然后localize到特定时区
# 注意:localize只应在你知道这个天真datetime实际属于哪个时区时使用
dt_naive = datetime(2023, 10, 26, 15, 30, 0)
dt_shanghai_aware = tz_shanghai.localize(dt_naive)
print(f"上海时间(由天真转感知): {dt_shanghai_aware}")
# 3. 时区转换 (astimezone)
dt_london_from_shanghai = dt_shanghai_aware.astimezone(tz_london)
print(f"从上海时间转换到伦敦时间: {dt_london_from_shanghai}")
# 从UTC转换到上海时间
dt_shanghai_from_utc = dt_utc_now.astimezone(tz_shanghai)
print(f"从UTC转换到上海时间: {dt_shanghai_from_utc}")
# 4. 处理夏令时边界(pytz的优势)
# 假设我们想看某个夏令时切换点
# 伦敦在2023年10月29日凌晨2点(夏令时)变为凌晨1点(标准时)
dt_before_dst = tz_london.localize(datetime(2023, 10, 29, 1, 30, 0)) # 凌晨1:30 BST
dt_after_dst = tz_london.localize(datetime(2023, 10, 29, 2, 30, 0)) # 凌晨2:30 GMT (实际是1:30 BST+1hr)
print(f"伦敦夏令时前: {dt_before_dst}")
print(f"伦敦夏令时后: {dt_after_dst}")
# 这里的localize会自动处理重复或缺失的时间点,这是pytz的强大之处我发现,在处理时区时,最好的习惯是所有内部存储和计算都基于UTC时间。只有在展示给用户或者从外部系统接收数据时,才进行时区转换。这能极大程度地避免各种“时间跳跃”或“时间重复”的怪问题。
datetime
datetime
比较日期时间
datetime
<
>
<=
>=
==
!=
from datetime import datetime
dt1 = datetime(2023, 10, 26, 10, 0, 0)
dt2 = datetime(2023, 10, 26, 11, 0, 0)
dt3 = datetime(2023, 10, 26, 10, 0, 0)
print(f"dt1 < dt2: {dt1 < dt2}") # True
print(f"dt1 == dt3: {dt1 == dt3}") # True
print(f"dt2 >= dt1: {dt2 >= dt1}") # True
# 注意:不同时区的感知datetime对象比较时,会先转换为共同的UTC时间再比较
from pytz import utc, timezone
dt_utc = datetime(2023, 10, 26, 10, 0, 0, tzinfo=utc)
dt_shanghai = datetime(2023, 10, 26, 18, 0, 0, tzinfo=timezone('Asia/Shanghai')) # 也是UTC 10:00:00
print(f"dt_utc == dt_shanghai: {dt_utc == dt_shanghai}") # True,因为它们代表同一UTC时间点这一点很重要,特别是带有时区信息的
datetime
排序日期时间数据
对包含
datetime
sort()
sorted()
from datetime import datetime
dt_list = [
datetime(2023, 10, 26, 15, 0, 0),
datetime(2023, 10, 25, 10, 0, 0),
datetime(2023, 10, 26, 9, 0, 0),
datetime(2023, 10, 27, 18, 0, 0)
]
print(f"原始列表: {dt_list}")
# 列表原地排序
dt_list.sort()
print(f"排序后列表: {dt_list}")
# 使用 sorted() 函数返回新列表
another_dt_list = [
datetime(2023, 1, 1),
datetime(2022, 12, 31),
datetime(2023, 1, 2)
]
sorted_another_dt_list = sorted(another_dt_list)
print(f"sorted() 函数排序后: {sorted_another_dt_list}")
# 对包含datetime对象的复杂数据结构进行排序
class Event:
def __init__(self, name, start_time):
self.name = name
self.start_time = start_time
def __repr__(self):
return f"Event('{self.name}', {self.start_time.strftime('%Y-%m-%d %H:%M')})"
events = [
Event("Meeting A", datetime(2023, 10, 26, 10, 0)),
Event("Lunch", datetime(2023, 10, 26, 12, 30)),
Event("Project Review", datetime(2023, 10, 25, 16, 0)),
Event("Daily Standup", datetime(2023, 10, 26, 9, 30))
]
# 按开始时间排序事件
events.sort(key=lambda event: event.start_time)
print(f"按开始时间排序的事件: {events}")对于性能,除非你是在处理百万级别甚至更高量级的日期时间数据,否则直接使用
datetime
datetime
在日期时间处理的旅程中,总有些意想不到的“坑”等着我们,同时也有一些小技巧能让代码跑得更快、更稳健。
常见的陷阱
天真(Naive)与感知(Aware)日期时间混淆: 这是最常见的,也是最隐蔽的陷阱。如果你在处理日期时间时不带时区信息(即使用天真
datetime
datetime
datetime.now()
datetime
pytz
datetime
strptime
strptime
ValueError
dateutil.parser.parse
夏令时(DST)的“跳跃”和“重复”: 在夏令时切换的日子里,时间可能会向前跳一小时(春天),或者向后重复一小时(秋天)。如果你直接用
timedelta
pytz
pytz.timezone.localize()
astimezone()
pytz
闰年和闰秒:
datetime
datetime
性能优化点
避免不必要的对象创建: 如果你仅仅需要一个时间戳(例如,用于日志记录或文件命名),直接使用
time.time()
datetime
import time # 比 datetime.now().timestamp() 稍快 current_unix_timestamp = time.time()
批量解析和格式化: 对于大量日期时间字符串的解析或格式化,如果性能成为瓶颈,可以考虑使用专门为数据分析设计的库,如
pandas
pandas
to_datetime
以上就是Python如何处理日期时间数据?datetime全攻略的详细内容,更多请关注php中文网其它相关文章!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号