pandas DataFrame基于前一天同小时条件创建difference列
实现逻辑
- 先将
datetime列从字符串转换为pandas原生时间格式,支撑时间偏移计算 - 构建时间到得分的检索映射表,通过时间键快速匹配对应记录的得分
- 逐行匹配计算:
- 将当前行的时间往前偏移1天,得到“前一天同一小时”的目标时间点
- 如果目标时间点在映射表中存在匹配得分,
difference= 当前行得分 - 匹配到的前一天同小时得分 - 如果目标时间点无匹配记录,
difference直接取当前行的得分值
注:该计算逻辑不依赖原始数据的行排序,即使
datetime列是乱序存储的,也能基于时间点的精准匹配得到正确结果,无需提前对DataFrame做时间排序。
可运行代码
import pandas as pd df = pd.DataFrame({ 'score': [2, 13, 24, 15, 11, 44], 'datetime': ["2017-08-30 07:00:00", "2017-08-30 08:00:00", "2017-08-31 07:00:00", "2017-08-31 08:00:00", "2017-08-29 21:00:00", "2017-08-28 21:00:00"] }) # 转换datetime列为时间类型 df['datetime'] = pd.to_datetime(df['datetime']) # 构建时间-得分映射字典 time_score_map = df.set_index('datetime')['score'].to_dict() def calc_difference(row): # 计算前一天同一小时的时间点 prev_same_time = row['datetime'] - pd.Timedelta(days=1) # 查找对应时间的得分 prev_score = time_score_map.get(prev_same_time, None) # 按规则计算差值 if prev_score is not None: return row['score'] - prev_score return row['score'] # 生成difference列 df['difference'] = df.apply(calc_difference, axis=1)
结果验证
运行代码后得到的difference列值依次为2、13、22、2、-33、44,与题目给出的预期示例完全匹配。
内容的提问来源于stack exchange,提问作者passcot
相关产品推荐
相关产品推荐

