python - 将 Pandas 时间戳四舍五入到最接近的 10 分钟

标签 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 round 函数实现吗?关于四舍五入 Pandas 时间戳的任何其他建议?

我正在使用 Pandas 0.23.1

最佳答案

我想像下面那样清理你的代码,它不会混合抽象级别并且更容易测试,希望也更具可读性:

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 标签转换为分钟数?

关于python - 将 Pandas 时间戳四舍五入到最接近的 10 分钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50903916/

相关文章:

python - 是否保证对 Pandas 数据框中的级别列表进行排序?

python - 从另一个数据框中的列值替换 Pandas 数据框中列中的值

python - 为什么 unicodecsv 不能正常写入?

javascript - 尝试将 javascript 数组传递给 Python Flask

python - 无法运行使用 cx-freeze 创建的 exe

python - 使用 python Flask 应用程序部署到 heroku 时 Procfile/wsgi 出现问题 ~ 找不到属性

python - 对某些数字之间的索引行求和 - Pandas Python

python - 使用 isin 函数后,我不能在 pandas Dataframe 上使用 filter 函数是有原因的吗?

python - 在 iPython 中无边框显示的 Pandas 数据框

python - 如何在 Python 中使用多个但数量有限的线程来处理列表