将熊猫时间戳舍入到最近的10分钟

时间:2018-06-18 06:44:20

标签: python pandas

我有一个空数据框,其中包含三个pandas时间戳:

import pandas as pd

ts1=pd.Timestamp('2017-06-01 00:05:00')
ts2=pd.Timestamp('2017-06-01 00:15:00')
ts3=pd.Timestamp('2017-06-01 00:25:00')

df=pd.DataFrame(index=[ts1, ts2, ts3])

现在我想将时间戳索引舍入到最近的10分钟:

df.index.round('10min')

但是我得到了一些意想不到的输出:

DatetimeIndex(['2017-06-01 00:00:00', '2017-06-01 00:20:00',
               '2017-06-01 00:20:00'],
              dtype='datetime64[ns]', freq=None)

请注意,2017-06-01 00:20:00时间戳会出现两次。这是正确的行为吗?我想要的输出是:

DatetimeIndex(['2017-06-01 00:00:00', '2017-06-01 00:10:00',
               '2017-06-01 00:20:00'],
              dtype='datetime64[ns]', freq=None)

我可以使用熊猫圆功能实现这一目标吗?有关舍入熊猫时间戳的任何其他建议吗?

我使用pandas 0.23.1

2 个答案:

答案 0 :(得分:1)

我想要清理你的代码,如下所示,它不会混合abstration的级别,并且更容易测试,希望也更具可读性:

import numpy as np
import pandas as pd

def is_exactly(x, minutes):
    return np.abs(x) == pd.to_timedelta(minutes * 60,unit='S')

def round_timestamp(ts):    
    floor=ts.floor('10 min')
    rounded=ts.round('10 min')    
    if is_exactly(rounded-ts, 5):
        return floor 
    else: 
        return rounded  

dt = pd.Timestamp('2017-01-01 00:15:00')
assert round_timestamp(dt) == pd.Timestamp('2017-01-01 00:10:00')

我自己,我很乐意了解频率10min标记如何转换为分钟?

答案 1 :(得分:0)

我想出了一个函数,它以我需要舍入的方式舍入时间戳:

def rounding_timestamps(df):
    import numpy as np

    rounded_values_floor=df.index.floor('10min')
    rounded_values=df.index.round('10min')

    diff=np.abs(rounded_values-df.index) 

    output=rounded_values.values

    I_floor=diff==pd.to_timedelta(300,unit='S') # 5min  
    output[I_floor] = rounded_values_floor[I_floor].values

    return pd.to_datetime(output)

基本上我使用正常的舍入,但只要时间戳恰好是中途,就切换到地板舍入。

适合我,但我会感谢更优雅的解决方案。