Ошибка округления времени до предыдущих 15 минут - Python - PullRequest
0 голосов
/ 06 марта 2019

Я разработал грубый метод округления меток времени до предыдущих 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)

Out:

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)

Out:

07:00:00

Я не понимаю, что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 06 марта 2019
- timedelta(hours=t.minute//15)

Если минута равна 20, то minute // 15 равно 1, поэтому вы вычитаете один час.

Попробуйте вместо этого:

return t.replace(second=0, microsecond=0, minute=(t.minute // 15 * 15), hour=t.hour)
2 голосов
/ 06 марта 2019

Используйте .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 минутные интервалы соответственно.

...