You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 18:45:27