将时间舍入到前15分钟时出错

2024-10-01 07:29:52 发布

您现在位置: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

我不明白我做错了什么


Tags: fromimportpandasdfdatetimetimeas时间
2条回答

.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

如果您需要分别获得最近的15分钟或接下来的15分钟invterval,那么还有.dt.round().dt.ceil()

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

如果minute是20,那么minute // 15等于1,所以减去1小时

请尝试以下操作:

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

相关问题 更多 >