如何去除pandas DateTimeIndex中的多余毫秒数?
解决pandas.date_range生成时间序列的多余毫秒/纳秒问题
我懂你这种烦躁的感觉——用pandas.date_range()生成时间序列时,莫名其妙冒出来的多余毫秒/纳秒确实很闹心,而且你试的几种方法都没彻底解决对吧?别慌,这里有几个更高效靠谱的方案:
方案1:用floor()或round()截断/取整到秒
这是最直接的矢量化操作,能彻底移除所有秒以下的时间单位:
import pandas as pd dr = pd.date_range('2011-01-01', '2011-01-03', periods=15) # 向下截断到最近的整秒(推荐,完全移除小数部分) dr_clean = dr.floor('S') print(dr_clean) # 或者四舍五入到整秒(根据需求选择) dr_clean_round = dr.round('S') print(dr_clean_round)
输出的DatetimeIndex会完全变成YYYY-MM-DD HH:MM:SS格式,没有任何多余的毫秒/纳秒。
方案2:批量替换微秒为0
DatetimeIndex支持直接调用replace()方法批量修改时间属性,一步清零所有秒以下的单位:
dr_clean = dr.replace(microsecond=0) print(dr_clean)
这个方法比你之前的循环或apply高效得多,因为它是pandas底层优化的矢量化操作,不需要逐元素处理。
方案3:转换为秒级精度的datetime类型
如果需要从底层存储层面就用秒精度(而不是默认的纳秒),可以这样转换:
# 先转成numpy的秒级datetime64,再重构DatetimeIndex dr_seconds = pd.DatetimeIndex(dr.astype('datetime64[s]')) print(dr_seconds)
这样生成的时间序列会以秒为最小单位存储,彻底避免小数时间单位的问题。
为什么你之前的方法没生效?
- 方法1用
pd.to_datetime(item, format='%Y-%m-%d %H:%M:%S')无效,是因为item本身已经是Timestamp类型了,format参数只对字符串输入生效,对datetime对象不起作用。 - 方法2直接
astype('datetime64[s]')报错,是因为DatetimeIndex不能直接通过astype转换精度,需要先转成numpy数组再重构索引(就是方案3的做法)。 - 方法3的
apply(lambda x:x.replace(microseconds=0))残留纳秒,大概率是因为底层存储的精度问题,用floor('S')可以彻底截断所有低于秒的单位,解决这个问题。
内容的提问来源于stack exchange,提问作者IMCoins
相关产品推荐
相关产品推荐

