如何在Python中基于时间条件为DataFrame添加Rate列
Python代码修改:添加Rate列区分小时内时间节点
现有代码每小时会在0分钟+时间差(对应计算0-5分钟的最小值、5-10分钟的最大值)和30分钟+时间差(对应计算30-35分钟的最小值、35-40分钟的最大值)的节点生成计算结果。需要给结果表添加Rate列,规则为:
- 属于0min+时间差的行(索引分钟数在0-29区间)显示"A"
- 属于30min+时间差的行(索引分钟数在30-59区间)显示"B"
修改后的完整代码
import numpy as np import pandas as pd from datetime import datetime, timedelta ts = ['25/02/2023 0:00', '25/02/2023 0:01', '25/02/2023 0:02', '25/02/2023 0:03', '25/02/2023 0:04', '25/02/2023 0:05', '25/02/2023 0:06', '25/02/2023 0:07', '25/02/2023 0:08', '25/02/2023 0:09', '25/02/2023 0:10', '25/02/2023 0:11', '25/02/2023 0:12', '25/02/2023 0:13', '25/02/2023 0:14', '25/02/2023 0:15', '25/02/2023 0:16', '25/02/2023 0:17', '25/02/2023 0:18', '25/02/2023 0:19', '25/02/2023 0:20', '25/02/2023 0:21', '25/02/2023 0:22', '25/02/2023 0:23', '25/02/2023 0:24', '25/02/2023 0:25', '25/02/2023 0:26', '25/02/2023 0:27', '25/02/2023 0:28', '25/02/2023 0:29', '25/02/2023 0:30', '25/02/2023 0:31', '25/02/2023 0:32', '25/02/2023 0:33', '25/02/2023 0:34', '25/02/2023 0:35', '25/02/2023 0:36', '25/02/2023 0:37', '25/02/2023 0:38', '25/02/2023 0:39', '25/02/2023 0:40', '25/02/2023 0:41', '25/02/2023 0:42', '25/02/2023 0:43', '25/02/2023 0:44', '25/02/2023 0:45', '25/02/2023 0:46', '25/02/2023 0:47', '25/02/2023 0:48', '25/02/2023 0:49', '25/02/2023 0:50', '25/02/2023 0:51', '25/02/2023 0:52', '25/02/2023 0:53', '25/02/2023 0:54', '25/02/2023 0:55', '25/02/2023 0:56', '25/02/2023 0:57', '25/02/2023 0:58', '25/02/2023 0:59', '25/02/2023 1:00', '25/02/2023 1:01', '25/02/2023 1:02', '25/02/2023 1:03', '25/02/2023 1:04', '25/02/2023 1:05', '25/02/2023 1:06', '25/02/2023 1:07', '25/02/2023 1:08', '25/02/2023 1:09', '25/02/2023 1:10', '25/02/2023 1:11'] temp = ['0', '21', '20', '30', '40', '50', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '70', '71'] df = pd.DataFrame(list(zip(ts, temp)), columns = ['ts', 'temp']) df['ts'] = pd.to_datetime(df['ts']) df1 = df.set_index('ts') # 每5分钟滚动计算最小值 df2 = df1.rolling(5, step=5).agg(['min']) # 筛选每小时0-5、30-35分钟的最小值结果(索引为5、35分) df3 = df2[df2.index.minute.isin([5,35])] # 将最小值结果的索引后移5分钟,对应到10、40分的节点 df3.index = df3.index + pd.to_timedelta('5 minutes') # 每5分钟滚动计算最大值 df4 = df1.rolling(5, step=5).agg(['max']) # 筛选每小时5-10、35-40分钟的最大值结果(索引为10、40分) df5 = df4[df4.index.minute.isin([10,40])] # 合并最小值和最大值结果 df6 = pd.merge(df3, df5, left_index=True, right_index=True) # 计算差值列 df6[('temp', 'diff')] = df6[('temp', 'max')] - df6[('temp', 'min')] # 添加Rate列:索引分钟数≤29显示"A",≥30显示"B" df6['Rate'] = np.where(df6.index.minute <= 29, 'A', 'B') # 查看结果 print(df6)
关键修改说明
- 替换错误的时间判断逻辑:原代码用当前系统时间判断
Rate的逻辑不符合需求,改为基于计算结果的索引时间(即10分、40分这些节点)来判断 - 高效批量赋值:使用
np.where直接根据索引分钟数区间批量赋值,避免低效循环 - 简化代码结构:移除重复的
import语句、无用的中间变量和冗余的合并操作,优化逻辑清晰度 - 修正索引对齐:确保合并后的DataFrame索引为正确的计算节点时间,保证
Rate赋值准确
内容的提问来源于stack exchange,提问作者Ashu
相关产品推荐
相关产品推荐

