pandas生成随机时间戳时如何为9:00-19:00区间分配更高权重
实现方案
核心思路是将一天的时间划分为高峰时段(9:00-19:00)和非高峰时段(其余时间),通过加权随机优先选择高峰区间生成时分秒,你可以直接调整权重参数控制两个时段的生成概率。
基础版本(两档权重,区间内均匀随机)
import pandas as pd import numpy as np # 可自定义配置参数 PEAK_PROB = 0.8 # 高峰时段生成概率,可按需调整为0-1之间的数值 PEAK_START_SEC = 9 * 3600 # 9点对应的当日秒数 PEAK_END_SEC = 19 * 3600 # 19点对应的当日秒数 FULL_DAY_SEC = 24 * 3600 sample_count = len(d) # 随机标记每条数据是否生成高峰时段时间 is_peak_sample = np.random.choice([True, False], size=sample_count, p=[PEAK_PROB, 1-PEAK_PROB]) # 分区间生成随机秒数 random_seconds = np.where( is_peak_sample, # 高峰时段:在9-19点范围内生成随机秒数 np.random.randint(PEAK_START_SEC, PEAK_END_SEC, size=sample_count), # 非高峰时段:拼接0-9点、19-24点两个不连续区间生成随机秒数 np.random.randint(0, FULL_DAY_SEC - (PEAK_END_SEC - PEAK_START_SEC), size=sample_count) + np.where( np.random.randint(0, FULL_DAY_SEC - (PEAK_END_SEC - PEAK_START_SEC), size=sample_count) < PEAK_START_SEC, 0, PEAK_END_SEC - PEAK_START_SEC ) ) # 生成最终完整日期时间列 d['full_datetime'] = pd.to_datetime(d['day']) + pd.to_timedelta(random_seconds, unit='s')
进阶版本(高峰时段钟形分布)
如果需要高峰时段的中间时间段(比如12-16点)概率更高,早晚边缘时段概率更低,可以用Beta分布生成更贴合真实人流的时间分布:
# 仅需要替换高峰时段的秒数生成逻辑即可 beta_val = np.random.beta(a=2, b=2, size=sample_count) # a、b参数越大,分布越集中在时段中间 random_seconds = np.where( is_peak_sample, PEAK_START_SEC + beta_val * (PEAK_END_SEC - PEAK_START_SEC), # 非高峰生成逻辑和基础版本一致 np.random.randint(0, FULL_DAY_SEC - (PEAK_END_SEC - PEAK_START_SEC), size=sample_count) + np.where( np.random.randint(0, FULL_DAY_SEC - (PEAK_END_SEC - PEAK_START_SEC), size=sample_count) < PEAK_START_SEC, 0, PEAK_END_SEC - PEAK_START_SEC ) ).astype(int)
参数调整说明
- 调整
PEAK_PROB的数值可以修改高峰时段的出现占比,比如设置为0.7就是70%的样本生成9-19点的时间 - 调整
np.random.beta的a和b参数可以修改高峰时段的分布形态,a=b>2时分布会更向中间集中
内容的提问来源于stack exchange,提问作者Callum Matthews
相关产品推荐
相关产品推荐

