如何修改 pandas 数据框的日期时间对象列中的分钟数?

How to modify minutes in a column of datetime object of pandas dataframe?

我想将 10 分钟间隔内的任何分钟转换为第 5 分钟。例如10-19分钟转换为15分钟,20-29分钟转换为25分钟等。

以下是数据框中我的日期时间列的摘录。

2020-06-25 13:23:48
2020-06-25 13:36:18
2020-06-25 13:41:32
2020-06-25 13:59:27

我想要的输出是:

2020-06-25 13:25:00
2020-06-25 13:35:00
2020-06-25 13:45:00
2020-06-25 13:55:00

构建数据框:

import pandas as pd
from datetime import datetime

df = pd.DataFrame(
    data={
        "dt": [
            "2020-06-25 13:23:48", "2020-06-25 13:36:18",
            "2020-06-25 13:41:32", "2020-06-25 13:59:27"
        ]
    }
)

df 看起来像这样:

              datetime
0  2020-06-25 13:23:48
1  2020-06-25 13:36:18
2  2020-06-25 13:41:32
3  2020-06-25 13:59:27

我们可以定义一个函数应用于dtdf:

def change_dt(x):
    f = "%Y-%m-%d %H:%M:%S"
    dt = datetime.strptime(x, f)
    
    if dt.minute < 10:
        m = 5
    elif dt.minute >= 10 and dt.minute < 20:
        m = 15
    elif dt.minute >= 20 and dt.minute < 30:
        m = 25
    elif dt.minute >= 30 and dt.minute < 40:
        m = 35
    elif dt.minute >= 40 and dt.minute < 50:
        m = 45
    else:
        m = 55
    
    return dt.replace(minute=m, second=0).strftime(f)

我们将 dfdt 列替换为将函数 change_dt 应用于此的结果列:

df.loc[:, "dt"] = df["dt"].apply(change_dt)

df 看起来像这样:

              datetime
0  2020-06-25 13:25:00
1  2020-06-25 13:35:00
2  2020-06-25 13:45:00
3  2020-06-25 13:55:00

这是我的做法,不过我相信还有其他巧妙的方法可以做到这一点:

df = pd.DataFrame({'time' : [pd.datetime(*x) for x in [[2020,6,25,13,23,48],[2020,6,25,13,36,18],[2020,6,25,13,41,32],[2020,6,25,13,59,27]]]})
df.time = df.time.apply(lambda x: pd.datetime(x.year, x.month, x.day, x.hour, (x.minute//10)*10+5, 0))

结果是这样的:

print(df):
                 time
0 2020-06-25 13:25:00
1 2020-06-25 13:35:00
2 2020-06-25 13:45:00
3 2020-06-25 13:55:00