首页 > 解决方案 > 如何在不使用最小/最大/总和或平均值的情况下将数据帧的日期时间值分配给下一个 15 分钟时间步长?

问题描述

我有一个带有电源配置文件的数据框。数据框显示事务期间的开始和结束时间以及消耗的功率。它看起来像这样:

交易 ID 开始时间 时间结束 力量
xyza123 2018.01.01 07:07:34 2018.01.01 07:34:08 70
hjker383 2018.01.01 10:21:00 2018.01.01 11:40:08 23

我的目标是分配一个新的开始时间和结束时间,它们设置为 15 分钟值。像这样:

交易 ID 开始时间 新开始时间 时间结束 新的结束时间 力量
xyza123 2018.01.01 07:07:34 2018.01.01 07:00:00 2018.01.01 07:34:08 2018.01.01 07:30:00 70
hjker383 2018.01.01 10:21:00 2018.01.01 10:30:00 2018.01.01 11:40:08 2018.01.01 11:45:00 23

之后可以删除旧的时间戳。但是我不想聚合它们。所以我猜

df.groupby(pd.Grouper(key="StartTime", freq="15min")).sum()

或者

df.groupby(pd.Grouper(key="StartEndtime", freq="15min")).mean()

等不是一种选择。我的另一个想法是创建一个数据框,其值介于2018.01.01 00:00:00和之间2018.01.01 23:45:00。但是,我不确定如何迭代真实的两个数据帧以实现我的目标,以及迭代真实的数据帧是否是一个好主意。

标签: pythonpandasdataframedatetime

解决方案


您可以使用函数将日期时间转换为最近的 15 分钟,然后将其应用于列此函数的灵感来自此链接

import datetime

def convertToNearest15(tm):
    discard = datetime.timedelta(minutes=tm.minute % 15,
                             seconds=tm.second,
                             microseconds=tm.microsecond)
    tm -= discard
    if discard >= datetime.timedelta(minutes=7.5):
        tm += datetime.timedelta(minutes=15)
    return tm


df['startTime'] = pd.to_datetime(df['startTime'])
df['newStartTime'] = df['startTime'].apply(convertToNearest15)
df['endTime'] = pd.to_datetime(df['endTime'])
df['newEndTime'] = df['endTime'].apply(convertToNearest15)

结果如下:

id     | startTime              | endTime               |  newStartTime     | newEndTime
xyza123 | 2018-01-01 07:07:34   | 2018-01-01 10:21:00   | 2018-01-01 07:15:00   | 2018-01-01 10:15:00
hjker383| 2018-01-01 07:34:08   |2018-01-01 11:40:08    |2018-01-01 07:30:00    |2018-01-01 11:45:00

推荐阅读