Pandas Timestamp四舍五入至10秒时出现异常问题求助
pandas Timestamp 按10秒舍入不符合预期的修复方案
问题原因
pandas的round()方法默认采用银行家舍入法(四舍六入五成双),当时间秒数处于两个10秒标记的中间点(如5、15、25等)时,会舍入到前一位数字为偶数的标记:
- 06:46:05 介于00和10之间,秒的十位是0(偶数),故舍至00;
- 06:46:15 介于10和20之间,秒的十位是1(奇数),故进至20;
- 06:46:25 介于20和30之间,秒的十位是2(偶数),故舍至20;
这就导致部分场景下不符合传统四舍五入的预期。
解决方案
方法一:偏移后向下取整(推荐)
通过给时间戳先加5秒,再向下取整到10秒,实现传统四舍五入逻辑:
- 秒数≤4时,加5秒后仍小于10的整数倍,向下取整到前一个10秒标记;
- 秒数≥5时,加5秒后达到或超过10的整数倍,向下取整到下一个10秒标记。
代码示例:
import pandas as pd date = pd.DataFrame([pd.to_datetime('2022-03-02 06:46:05'), pd.to_datetime('2022-03-02 06:46:15'), pd.to_datetime('2022-03-02 06:46:25'), pd.to_datetime('2022-03-02 06:46:35'), pd.to_datetime('2022-03-02 06:46:45'), pd.to_datetime('2022-03-02 06:46:55'), pd.to_datetime('2022-03-02 06:47:05'), pd.to_datetime('2022-03-02 06:47:15'), pd.to_datetime('2022-03-02 06:47:25')]) # 偏移5秒后向下取整到10秒 date[1] = (date[0] + pd.Timedelta(seconds=5)).dt.floor('10s') print(date)
输出结果:
0 1 0 2022-03-02 06:46:05 2022-03-02 06:46:10 1 2022-03-02 06:46:15 2022-03-02 06:46:20 2 2022-03-02 06:46:25 2022-03-02 06:46:30 3 2022-03-02 06:46:35 2022-03-02 06:46:40 4 2022-03-02 06:46:45 2022-03-02 06:46:50 5 2022-03-02 06:46:55 2022-03-02 06:47:00 6 2022-03-02 06:47:05 2022-03-02 06:47:10 7 2022-03-02 06:47:15 2022-03-02 06:47:20 8 2022-03-02 06:47:25 2022-03-02 06:47:30
方法二:自定义舍入函数
如果需要更灵活的阈值控制,可以编写自定义函数,根据秒数余数判断向上/向下取整:
import pandas as pd date = pd.DataFrame([pd.to_datetime('2022-03-02 06:46:05'), pd.to_datetime('2022-03-02 06:46:15'), pd.to_datetime('2022-03-02 06:46:25'), pd.to_datetime('2022-03-02 06:46:35'), pd.to_datetime('2022-03-02 06:46:45'), pd.to_datetime('2022-03-02 06:46:55'), pd.to_datetime('2022-03-02 06:47:05'), pd.to_datetime('2022-03-02 06:47:15'), pd.to_datetime('2022-03-02 06:47:25')]) def custom_round_10s(timestamp): if timestamp.second % 10 >= 5: return timestamp.ceil('10s') else: return timestamp.floor('10s') date[1] = date[0].apply(custom_round_10s) print(date)
此方法同样能得到符合预期的结果,适合需要调整舍入判断条件的场景。
内容的提问来源于stack exchange,提问作者JaboSammy
相关产品推荐
相关产品推荐

