如何在Pandas中获取最接近0天的time delta列?
解决方案
步骤说明
- 从透视后的宽表中提取所有
time_delta相关列 - 对每行的时间差值,通过计算天数平方的最小值定位最接近0的时间差(替代
abs()方法) - 将结果作为新列添加到宽表中
- 可选调整列顺序,优化输出格式
完整代码实现
import pandas as pd import numpy as np # 原始数据定义 gp_columns = { 'name': ['companyA', 'companyB'], 'firm_ID' : [1, 2], 'timestamp_one' : ['2016-04-01', '2017-09-01'] } fund_columns = { 'firm_ID': [1, 1, 2, 2, 2], 'department_ID' : [10, 11, 20, 21, 22], 'timestamp_mult' : ['2015-01-01', '2016-03-01', '2016-10-01', '2017-02-01', '2018-11-01'], 'number' : [400, 500, 1000, 3000, 4000] } # 初始化DataFrame并转换时间格式 gp_df = pd.DataFrame(gp_columns) fund_df = pd.DataFrame(fund_columns) gp_df['timestamp_one'] = pd.to_datetime(gp_df['timestamp_one']) fund_df['timestamp_mult'] = pd.to_datetime(fund_df['timestamp_mult']) # 合并数据并生成辅助列 merged_df = gp_df.merge(fund_df) merged_df_v1 = merged_df.copy() merged_df_v1['incidence_num'] = merged_df.groupby('firm_ID')['department_ID'].transform('cumcount') + 1 merged_df_v1['time_delta'] = merged_df_v1['timestamp_mult'] - merged_df_v1['timestamp_one'] # 透视生成宽表 merged_wide = pd.pivot(merged_df_v1, index=['name','firm_ID', 'timestamp_one'], columns='incidence_num', values=['department_ID', 'time_delta', 'timestamp_mult', 'number']).reset_index() # 提取所有time_delta列 time_delta_cols = [col for col in merged_wide.columns if col[0] == 'time_delta'] # 计算最接近0的time_delta(用平方替代abs方法) merged_wide['closest_time_delta'] = merged_wide[time_delta_cols].apply( lambda row: row.loc[np.argmin(row.dt.days ** 2)], axis=1 ) # 调整列顺序,将新列前置 cols = merged_wide.columns.tolist() cols.insert(3, cols.pop(cols.index('closest_time_delta'))) merged_wide = merged_wide[cols] # 输出结果 print(merged_wide)
结果说明
closest_time_delta列即为每个公司对应的所有时间差中最接近0的取值- 通过计算时间差天数的平方,利用平方值最小对应最接近0的特性,规避了
abs()方法的使用
内容的提问来源于stack exchange,提问作者tab_stopp
相关产品推荐
相关产品推荐

