【问题标题】:Pandas .dt.round rounds the nearest hour randomly?Pandas .dt.round 随机取整最近的小时?
【发布时间】:2025-11-21 19:10:01
【问题描述】:

我有一个带有 3 个时间戳的变量。

a = DatetimeIndex(['2016-01-26 20:30:00', '2016-01-26 21:30:00','2016-01-26 22:30:00'],
              dtype='datetime64[ns]', freq='H')

我现在了解到,round 函数根据这些规则进行舍入,“当两个整数之间的中间时,选择偶数。”

a.round('H')
DatetimeIndex(['2016-01-26 20:00:00', '2016-01-26 22:00:00','2016-01-26 22:00:00'],
              dtype='datetime64[ns]', freq=None)

我如何确保它将所有 30 分钟的时间戳(例如 20:30、19:30)四舍五入到下一小时。

谢谢!

编辑:

我已经从Pandas Timestamp rounds 30 seconds inconsistently尝试了以下功能

def half_up_minute(x):
    m = (x - x.floor('H')).total_seconds() < 30   # Round True Down, False Up
    return x.where(m).floor('H').fillna(x.ceil('H'))

但得到以下错误:

TypeError: 'value' must be a scalar, passed: DatetimeIndex

【问题讨论】:

  • 答案是关于30S,但我认为和这里一样。
  • 该功能对我不起作用。我收到一个错误:AttributeError: 'DatetimeIndex' object has no attribute 'dt 当我删除 .dt 时,我收到以下错误:TypeError: 'value' must be a scalar, passed: DatetimeIndex
  • 只删除.dt
  • 好的,我去测试一下。预期输出为21,22,23 ?
  • @jezrael 是的,是的

标签: python pandas datetime timestamp


【解决方案1】:

您可以将替换fillna 系列的功能更改为Index.where 中的第二个参数,并通过30 Minutes 进行比较:

def half_up_minute(x):
    m = (x - x.floor('H')).total_seconds() < 30 * 60   
    return x.floor('H').where(m, x.ceil('H'))

print (half_up_minute(a))
DatetimeIndex(['2016-01-26 21:00:00', '2016-01-26 22:00:00',
               '2016-01-26 23:00:00'],
              dtype='datetime64[ns]', freq=None)   

a = pd.date_range('2016-01-26 20:30:00', periods=20, freq='10T')
print (a)
DatetimeIndex(['2016-01-26 20:30:00', '2016-01-26 20:40:00',
               '2016-01-26 20:50:00', '2016-01-26 21:00:00',
               '2016-01-26 21:10:00', '2016-01-26 21:20:00',
               '2016-01-26 21:30:00', '2016-01-26 21:40:00',
               '2016-01-26 21:50:00', '2016-01-26 22:00:00',
               '2016-01-26 22:10:00', '2016-01-26 22:20:00',
               '2016-01-26 22:30:00', '2016-01-26 22:40:00',
               '2016-01-26 22:50:00', '2016-01-26 23:00:00',
               '2016-01-26 23:10:00', '2016-01-26 23:20:00',
               '2016-01-26 23:30:00', '2016-01-26 23:40:00'],
              dtype='datetime64[ns]', freq='10T')

def half_up_minute(x):
    m = (x - x.floor('H')).total_seconds() < 30 * 60   
    return x.floor('H').where(m, x.ceil('H'))

print (half_up_minute(a))
DatetimeIndex(['2016-01-26 21:00:00', '2016-01-26 21:00:00',
               '2016-01-26 21:00:00', '2016-01-26 21:00:00',
               '2016-01-26 21:00:00', '2016-01-26 21:00:00',
               '2016-01-26 22:00:00', '2016-01-26 22:00:00',
               '2016-01-26 22:00:00', '2016-01-26 22:00:00',
               '2016-01-26 22:00:00', '2016-01-26 22:00:00',
               '2016-01-26 23:00:00', '2016-01-26 23:00:00',
               '2016-01-26 23:00:00', '2016-01-26 23:00:00',
               '2016-01-26 23:00:00', '2016-01-26 23:00:00',
               '2016-01-27 00:00:00', '2016-01-27 00:00:00'],
              dtype='datetime64[ns]', freq=None)

【讨论】: