python - 如何在不使用最小/最大/总和或平均值的情况下将数据帧的日期时间值分配给下一个 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
。但是,我不确定如何迭代真实的两个数据帧以实现我的目标,以及迭代真实的数据帧是否是一个好主意。
解决方案
您可以使用函数将日期时间转换为最近的 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
推荐阅读
- javascript - Ajax 请求,格式化结果时,如果我添加超过 2 行代码,某些元素会失败
- swift - 使用swift构建来自firebase的实时位置数据请求
- openlayers - 如何在 Open Layers 5 中更新 XYZ 层
- c++ - 我的代码块不支持元组。我现在能做什么?
- android - 在 API 24+ 上使用 Uri 通过 Intent 打开文件
- java - Akka Streams + Akka 集群
- java - 正则表达式不检测空格
- pydev - 将 zip 文件附加到 pydev tracker 中的新问题
- python-3.x - paho mqtt:使用 python 3 编译时输出不正确
- node.js - 无法启动 npm/yarn