基于日期时间条件为pandas DataFrame创建transfer转乘标识列
智能卡交易数据转乘标识计算实现
需求背景
现有万条以上规模的交通机构每日智能卡交易数据,需要新增名为transfer的字段标识单条交易是否属于转乘交易。
模拟数据集
用于测试的模拟数据集构造代码如下:
import pandas as pd mock_df = pd.DataFrame({ 'cardNumber': ['100', '100', '100', '200', '300', '300', '300'], 'type': ['DAILY_CAP_REACHED', 'DAILY_CAP_REACHED', 'DAILY_CAP_REACHED', 'DAILY_CAP_REACHED', 'DAILY_CAP_REACHED', 'DAILY_CAP_REACHED', 'DAILY_CAP_REACHED'], 'date_only': ['2021/05/01', '2021/05/01', '2021/05/01', '2021/05/01', '2021/05/04', '2021/05/04', '2021/05/04'], 'time_only': ['17:15', '17:45', '18:15', '12:15', '13:15', '17:45', '18:15'], 'fare': [250, 0, 0, 250, 250, 0, 0] })
原始模拟数据集结构:
cardNumber type date_only time_only fare 0 100 DAILY_CAP_REACHED 2021/05/01 17:15 250 1 100 DAILY_CAP_REACHED 2021/05/01 17:45 0 2 100 DAILY_CAP_REACHED 2021/05/01 18:15 0 3 200 DAILY_CAP_REACHED 2021/05/01 12:15 250 4 300 DAILY_CAP_REACHED 2021/05/04 13:15 250 5 300 DAILY_CAP_REACHED 2021/05/04 17:45 0 6 300 DAILY_CAP_REACHED 2021/05/04 18:15 0
转乘判定规则
同一张卡同一日内的连续两笔交易,间隔小于等于90分钟则后一笔判定为转乘,否则不算;单日首笔交易默认不属于转乘。
实现代码
# 1. 合并日期与时间为datetime格式,用于计算时间差 mock_df['transaction_datetime'] = pd.to_datetime(mock_df['date_only'] + ' ' + mock_df['time_only']) # 2. 按卡号、日期、交易时间排序,确保交易顺序正确 mock_df = mock_df.sort_values(by=['cardNumber', 'date_only', 'transaction_datetime']).reset_index(drop=True) # 3. 分组计算每笔交易与同卡同日上一笔交易的时间差(单位:分钟) mock_df['prev_transaction_time'] = mock_df.groupby(['cardNumber', 'date_only'])['transaction_datetime'].shift(1) mock_df['time_diff_min'] = (mock_df['transaction_datetime'] - mock_df['prev_transaction_time']).dt.total_seconds() / 60 # 4. 生成transfer标识 mock_df['transfer'] = mock_df.apply( lambda row: 'Y' if pd.notna(row['time_diff_min']) and row['time_diff_min'] <= 90 else 'N', axis=1 ) # 5. 删除计算过程的辅助列,保留原始字段+transfer mock_df = mock_df.drop(columns=['transaction_datetime', 'prev_transaction_time', 'time_diff_min'])
输出结果
最终生成的数据集结构与预期完全一致:
cardNumber type date_only time_only fare transfer 0 100 DAILY_CAP_REACHED 2021/05/01 17:15 250 N 1 100 DAILY_CAP_REACHED 2021/05/01 17:45 0 Y 2 100 DAILY_CAP_REACHED 2021/05/01 18:15 0 Y 3 200 DAILY_CAP_REACHED 2021/05/01 12:15 250 N 4 300 DAILY_CAP_REACHED 2021/05/04 13:15 250 N 5 300 DAILY_CAP_REACHED 2021/05/04 17:45 0 N 6 300 DAILY_CAP_REACHED 2021/05/04 18:15 0 Y
内容的提问来源于stack exchange,提问作者gernworm
相关产品推荐
相关产品推荐

