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

strptime预设小时不一致:如何统一Pandas时间转换的时分秒?

解决Pandas Series转Datetime时统一时分秒的问题

哈哈,这个问题我之前也踩过类似的坑!先给你揪出一个最容易忽略的错误——你写的%M是分钟的格式符,而不是月份!正确的月份格式符是小写的%m,这大概率是导致你得到奇怪小时数的核心原因。

先修正格式符的问题

如果你的原始序列是类似20231005(年-月-日)的数字或字符串,用%Y%M%d会把中间的10当成分钟来解析,这完全不符合你的预期,自然会出现混乱的时间部分。正确的格式应该是'%Y%m%d'。

更高效的转换方式(优先推荐)

别用apply逐元素处理啦,Pandas自带的pd.to_datetime()是矢量化操作,速度比apply快N倍,尤其是数据量大的时候。转换后默认的时分秒就是00:00:00,完美符合你的需求:

import pandas as pd

# 假设你的数字序列是这个Series
s = pd.Series([20231005, 20231006, 20231007])
# 转换为datetime,指定正确的格式
dt_series = pd.to_datetime(s, format='%Y%m%d')

如果需要强制重置时分秒(比如已有时间数据的情况)

如果因为某些原因,转换后的datetime已经带有随机的时分秒,或者你需要确保绝对统一,可以用这两种方法快速重置:

  • 方法1:用dt.normalize(),直接把时间部分重置为当天午夜
    dt_series = dt_series.dt.normalize()
    
  • 方法2:用dt.floor('D'),向下取整到“天”级别,同样会把时分秒设为00:00:00
    dt_series = dt_series.dt.floor('D')
    

如果你一定要用apply+strptime的方式

虽然不推荐,但如果有特殊需求要这么写,记得先修正格式符,再通过replace强制设置时分秒:

from datetime import datetime

dt_series = s.apply(lambda x: datetime.strptime(str(x), '%Y%m%d').replace(hour=0, minute=0, second=0))

总结一下:核心先把格式符%M改成%m,然后优先用Pandas原生的矢量化方法处理,既高效又不容易出错~

内容的提问来源于stack exchange,提问作者3pitt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:50:17