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:00dt_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
相关产品推荐
相关产品推荐

