熊猫DatetimeIndex.round的行为不一致?

时间:2020-06-12 15:21:50

标签: pandas rounding datetimeindex

我在熊猫的圆法中遇到了一个奇怪的,非常意外的行为。DatetimeIndex:

import pandas as pd
import datetime as dt
t1 = pd.DatetimeIndex([dt.datetime(2013,12,5,1,30,0),
                       dt.datetime(2013,12,5,2,30,0),
                       dt.datetime(2013,12,5,3,30,0),
                       dt.datetime(2013,12,5,4,30,0)])  
print(t1)

给予:

DatetimeIndex(['2013-12-05 01:30:00', '2013-12-05 02:30:00',
               '2013-12-05 03:30:00', '2013-12-05 04:30:00'],
              dtype='datetime64[ns]', freq=None)

到目前为止,太好了。现在我想四舍五入到最近的整整一个小时。我不在乎是选择下一个小时还是前一个小时。但是我需要一致的行为。

t2 = t1.round('H')
print(t2)

我惊讶地得到:

DatetimeIndex(['2013-12-05 02:00:00', '2013-12-05 02:00:00',
               '2013-12-05 04:00:00', '2013-12-05 04:00:00'],
              dtype='datetime64[ns]', freq=None)

项1和3向上舍入,而项2和4向下舍入。这是应有的行为吗?我想引擎盖下正在发生一些数字化的事情。但这确实令人不安。在我的情况下,时间分辨率限制为分钟。因此,我可以每次加(或减)1s并获得所需的结果。但这不是正确的方法。

1 个答案:

答案 0 :(得分:1)

许多人学习“四舍五入”规则,例如将1.5舍入为2,将2.5舍入为3,依此类推。这不是不是,在numpy中如何处理舍入。在numpy.around中,强调我自己。

对于恰好介于四舍五入十进制值之间的值,NumPy 将舍入到最接近的偶数值。因此1.5和2.5四舍五入为2.0,-0.5 和0.5舍入到0.0,等等。

以小时分数来考虑您的时间,这是预期的行为:

np.around([1.5, 2.5, 3.5, 4.5])
#array([2., 2., 4., 4.])

(熊猫使用RoundTo.NEAREST_HALF_EVEN进行四舍五入来定义相同的行为)


那么您如何用频率四舍五入一个Datetime?

深埋是一种RoundTo方法,而我们想要的舍入是RoundTo.NEAREST_HALF_PLUS_INFTY。我们需要处理datetimes的复杂性,但是熊猫已经可以处理了。还要导入round_nsint64方法。

from pandas._libs.tslibs.timestamps import RoundTo, round_nsint64

# rounded int64s 
rounded = round_nsint64(t1.view('i8'), RoundTo.NEAREST_HALF_PLUS_INFTY, 'H')

# Convert back to datetime
pd.DatetimeIndex(rounded)
#DatetimeIndex(['2013-12-05 02:00:00', '2013-12-05 03:00:00',
#               '2013-12-05 04:00:00', '2013-12-05 05:00:00'],
#              dtype='datetime64[ns]', freq=None)