You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 12:44:59