如何在Pandas中生成不晚于指定datetime列的随机日期列
生成不超过对应contract_starts日期的contract_noted列
问题背景
现有Pandas DataFrame df_sample 初始结构如下:
columnA columnB A AA A AB B BA B BB B BC
已通过以下代码生成随机日期列contract_starts:
import pandas as pd import numpy as np df_sample['contract_starts'] = np.random.choice(pd.date_range('2024-01-01', '2024-05-01'), len(df_sample))
生成结果示例:
columnA columnB contract_starts A AA 2024-01-21 A AB 2024-03-03 B BA 2024-01-18 B BB 2024-02-18 B BC 2024-04-03
需生成新的datetime列contract_noted,要求:
- 日期落在
2024-01-01至2024-05-01范围内 - 不超过对应行的
contract_starts日期
解决方案
方法1:逐行生成(小数据集适用)
利用apply对每行的contract_starts生成专属日期范围,再随机选值:
# 定义日期边界 start_bound = pd.Timestamp('2024-01-01') # 生成contract_noted列 df_sample['contract_noted'] = df_sample['contract_starts'].apply( lambda x: np.random.choice(pd.date_range(start_bound, x)) )
说明:若contract_starts等于起始边界,会直接返回该日期,符合要求
方法2:矢量化生成(大数据集高效)
避免循环开销,用矢量化计算生成随机日期偏移:
start_bound = pd.Timestamp('2024-01-01') # 计算每行contract_starts与起始边界的天数差 days_diff = (df_sample['contract_starts'] - start_bound).dt.days # 生成0到days_diff之间的随机整数(代表偏移天数) random_days = np.random.randint(0, days_diff + 1) # 转换为日期 df_sample['contract_noted'] = start_bound + pd.to_timedelta(random_days, unit='D')
说明:此方法完全基于数组运算,处理大规模数据时效率远高于逐行循环
结果示例
执行后df_sample输出示例(随机结果):
columnA columnB contract_starts contract_noted 0 A AA 2024-01-21 2024-01-20 1 A AB 2024-03-03 2024-01-01 2 B BA 2024-01-18 2024-01-13 3 B BB 2024-02-18 2024-02-01 4 B BC 2024-04-03 2024-03-28
内容的提问来源于stack exchange,提问作者PV8
相关产品推荐
相关产品推荐

