基于0-6阶滞后的Date1与Date2差值计算及标记需求
需求说明
我有一个包含Date1和Date2两列的数据集,需针对滞后0到6阶执行以下操作:
- 对每一行的
Date2,依次与当前行、下1行……下6行的Date1进行比较 - 若
Date2大于对应位置的Date1,标记为1,否则标记为0 - 迭代逻辑示例:
date2[0]与date1[0]、date1[1]……date1[5]分别比较date2[1]与date1[1]、date1[2]……date1[6]分别比较- 以此类推
数据集示例
Date1 Date2 0 2021-06-15 00:25:29 2021-06-15 10:05:50 1 2021-06-15 13:32:01 2021-06-15 14:17:30 2 2021-06-15 17:59:37 2021-06-15 18:12:30 3 2021-06-17 01:01:16 2021-06-17 13:30:23 4 2021-06-17 14:07:11 2021-06-17 14:34:45 5 2021-06-17 18:30:24 2021-06-17 19:22:02 6 2021-06-17 19:42:28 2021-06-18 10:11:04 7 2021-06-18 12:54:50 2021-06-18 13:25:16 8 2021-06-18 16:59:40 2021-06-18 17:22:23 9 2021-06-18 17:49:54 2021-06-18 18:25:53 10 2021-06-18 19:57:39 2021-06-18 20:43:11 11 2021-06-21 13:52:28 2021-06-21 14:03:31 12 2021-06-21 15:44:46 2021-06-21 18:31:21 13 2021-06-21 20:03:37 2021-06-21 20:59:54 14 2021-06-22 18:39:22 2021-06-22 19:23:28 15 2021-06-23 19:45:54 2021-06-23 19:52:26 16 2021-06-23 19:59:33 2021-06-23 20:00:43 17 2021-06-24 12:53:31 2021-06-25 13:25:30 18 2021-06-25 17:57:05 2021-06-25 19:32:37 19 2021-06-28 13:34:25 2021-06-28 14:00:04
原始数据结构
{'Date1': {0: Timestamp('2021-06-15 00:25:29'), 1: Timestamp('2021-06-15 13:32:01'), 2: Timestamp('2021-06-15 17:59:37'), 3: Timestamp('2021-06-17 01:01:16'), 4: Timestamp('2021-06-17 14:07:11'), 5: Timestamp('2021-06-17 18:30:24'), 6: Timestamp('2021-06-17 19:42:28'), 7: Timestamp('2021-06-18 12:54:50'), 8: Timestamp('2021-06-18 16:59:40'), 9: Timestamp('2021-06-18 17:49:54'), 10: Timestamp('2021-06-18 19:57:39'), 11: Timestamp('2021-06-21 13:52:28'), 12: Timestamp('2021-06-21 15:44:46'), 13: Timestamp('2021-06-21 20:03:37'), 14: Timestamp('2021-06-22 18:39:22'), 15: Timestamp('2021-06-23 19:45:54'), 16: Timestamp('2021-06-23 19:59:33'), 17: Timestamp('2021-06-24 12:53:31'), 18: Timestamp('2021-06-25 17:57:05'), 19: Timestamp('2021-06-28 13:34:25')}, 'Date2': {0: Timestamp('2021-06-15 10:05:50'), 1: Timestamp('2021-06-15 14:17:30'), 2: Timestamp('2021-06-15 18:12:30'), 3: Timestamp('2021-06-17 13:30:23'), 4: Timestamp('2021-06-17 14:34:45'), 5: Timestamp('2021-06-17 19:22:02'), 6: Timestamp('2021-06-18 10:11:04'), 7: Timestamp('2021-06-18 13:25:16'), 8: Timestamp('2021-06-18 17:22:23'), 9: Timestamp('2021-06-18 18:25:53'), 10: Timestamp('2021-06-18 20:43:11'), 11: Timestamp('2021-06-21 14:03:31'), 12: Timestamp('2021-06-21 18:31:21'), 13: Timestamp('2021-06-21 20:59:54'), 14: Timestamp('2021-06-22 19:23:28'), 15: Timestamp('2021-06-23 19:52:26'), 16: Timestamp('2021-06-23 20:00:43'), 17: Timestamp('2021-06-25 13:25:30'), 18: Timestamp('2021-06-25 19:32:37'), 19: Timestamp('2021-06-28 14:00:04')}}
实现代码
使用Python pandas库完成需求,代码如下:
import pandas as pd from pandas import Timestamp # 加载原始数据 data = {'Date1': {0: Timestamp('2021-06-15 00:25:29'), 1: Timestamp('2021-06-15 13:32:01'), 2: Timestamp('2021-06-15 17:59:37'), 3: Timestamp('2021-06-17 01:01:16'), 4: Timestamp('2021-06-17 14:07:11'), 5: Timestamp('2021-06-17 18:30:24'), 6: Timestamp('2021-06-17 19:42:28'), 7: Timestamp('2021-06-18 12:54:50'), 8: Timestamp('2021-06-18 16:59:40'), 9: Timestamp('2021-06-18 17:49:54'), 10: Timestamp('2021-06-18 19:57:39'), 11: Timestamp('2021-06-21 13:52:28'), 12: Timestamp('2021-06-21 15:44:46'), 13: Timestamp('2021-06-21 20:03:37'), 14: Timestamp('2021-06-22 18:39:22'), 15: Timestamp('2021-06-23 19:45:54'), 16: Timestamp('2021-06-23 19:59:33'), 17: Timestamp('2021-06-24 12:53:31'), 18: Timestamp('2021-06-25 17:57:05'), 19: Timestamp('2021-06-28 13:34:25')}, 'Date2': {0: Timestamp('2021-06-15 10:05:50'), 1: Timestamp('2021-06-15 14:17:30'), 2: Timestamp('2021-06-15 18:12:30'), 3: Timestamp('2021-06-17 13:30:23'), 4: Timestamp('2021-06-17 14:34:45'), 5: Timestamp('2021-06-17 19:22:02'), 6: Timestamp('2021-06-18 10:11:04'), 7: Timestamp('2021-06-18 13:25:16'), 8: Timestamp('2021-06-18 17:22:23'), 9: Timestamp('2021-06-18 18:25:53'), 10: Timestamp('2021-06-18 20:43:11'), 11: Timestamp('2021-06-21 14:03:31'), 12: Timestamp('2021-06-21 18:31:21'), 13: Timestamp('2021-06-21 20:59:54'), 14: Timestamp('2021-06-22 19:23:28'), 15: Timestamp('2021-06-23 19:52:26'), 16: Timestamp('2021-06-23 20:00:43'), 17: Timestamp('2021-06-25 13:25:30'), 18: Timestamp('2021-06-25 19:32:37'), 19: Timestamp('2021-06-28 14:00:04')}} df = pd.DataFrame(data) # 生成Date1的7元素滑动窗口矩阵(对应滞后0-6阶) date1_windows = df['Date1'].rolling(window=7).apply(lambda x: x).dropna() date1_matrix = date1_windows.to_numpy().reshape(-1, 7) # 提取对应位置的Date2值 date2_values = df['Date2'].iloc[:len(date1_matrix)].to_numpy().reshape(-1, 1) # 比较生成0/1标记矩阵,并转为DataFrame result_matrix = (date2_values > date1_matrix).astype(int) result_df = pd.DataFrame(result_matrix, columns=[f'lag_{i}' for i in range(7)]) # 合并原数据与结果 final_df = pd.concat([df.iloc[6:].reset_index(drop=True), result_df], axis=1) # 查看结果 print(final_df.head())
输出结果示例
执行代码后,输出的前5行结果如下:
Date1 Date2 lag_0 lag_1 lag_2 lag_3 lag_4 lag_5 lag_6 0 2021-06-17 19:42:28 2021-06-18 10:11:04 1 1 1 1 1 1 1 1 2021-06-18 12:54:50 2021-06-18 13:25:16 1 1 1 1 0 0 0 2 2021-06-18 16:59:40 2021-06-18 17:22:23 1 1 0 0 0 0 0 3 2021-06-18 17:49:54 2021-06-18 18:25:53 1 0 0 0 0 0 0 4 2021-06-18 19:57:39 2021-06-18 20:43:11 1 0 0 0 0 0 0
内容的提问来源于stack exchange,提问作者Beck

