You need to enable JavaScript to run this app. 基于日期时间条件为pandas DataFrame创建transfer转乘标识列
优惠活动
大模型
产品
解决方案
定价
更多

基于日期时间条件为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 11:24:10