将时间四舍五入到前 15 分钟时出错 - Python

Error rounding time to previous 15 min - Python

我开发了一种粗略的方法来将时间戳四舍五入到前 15 分钟。例如,如果时间戳为 8:10:00,则四舍五入为 8:00:00

但是,当超过 15 分钟时,它会舍入到前一小时。例如,如果时间戳是 8:20:00,由于某种原因它会四舍五入到 7:00:00?我将在下面列出两个示例。

正确的舍入:

import pandas as pd
from datetime import datetime, timedelta

d = ({
    'Time' : ['8:00:00'],                                                                                          
     })

df = pd.DataFrame(data=d)

df['Time'] = pd.to_datetime(df['Time'])

FirstTime = df['Time'].iloc[0]

def hour_rounder(t):
    return (t.replace(second=0, microsecond=0, minute=0, hour=t.hour)
               -timedelta(hours=t.minute//15))

StartTime = hour_rounder(FirstTime)
StartTime = datetime.time(StartTime)

print(StartTime)

输出:

08:00:00

不正确的舍入:

import pandas as pd
from datetime import datetime, timedelta

d = ({
    'Time' : ['8:20:00'],                                                                                          
     })

df = pd.DataFrame(data=d)

df['Time'] = pd.to_datetime(df['Time'])

FirstTime = df['Time'].iloc[0]

def hour_rounder(t):
    return (t.replace(second=0, microsecond=0, minute=0, hour=t.hour)
               -timedelta(hours=t.minute//15))

StartTime = hour_rounder(FirstTime)
StartTime = datetime.time(StartTime)

print(StartTime)

输出:

07:00:00

我不明白我做错了什么?

使用 .dt.floor('15min') 舍入为 15 分钟间隔。

import pandas as pd
df = pd.DataFrame({'Time': pd.date_range('2018-01-01', freq='13.141min', periods=13)})

df['prev_15'] = df.Time.dt.floor('15min')

输出:

                      Time             prev_15
0  2018-01-01 00:00:00.000 2018-01-01 00:00:00
1  2018-01-01 00:13:08.460 2018-01-01 00:00:00
2  2018-01-01 00:26:16.920 2018-01-01 00:15:00
3  2018-01-01 00:39:25.380 2018-01-01 00:30:00
4  2018-01-01 00:52:33.840 2018-01-01 00:45:00
5  2018-01-01 01:05:42.300 2018-01-01 01:00:00
6  2018-01-01 01:18:50.760 2018-01-01 01:15:00
7  2018-01-01 01:31:59.220 2018-01-01 01:30:00
8  2018-01-01 01:45:07.680 2018-01-01 01:45:00
9  2018-01-01 01:58:16.140 2018-01-01 01:45:00
10 2018-01-01 02:11:24.600 2018-01-01 02:00:00
11 2018-01-01 02:24:33.060 2018-01-01 02:15:00
12 2018-01-01 02:37:41.520 2018-01-01 02:30:00

还有.dt.round().dt.ceil()如果你需要得到最近的15分钟,或者分别是后面的15分钟间隔。

- timedelta(hours=t.minute//15)

如果分钟为 20,则 minute // 15 等于 1,因此您要减去一小时。

试试这个:

return t.replace(second=0, microsecond=0, minute=(t.minute // 15 * 15), hour=t.hour)