为百万级用户数据集df生成符合时序与季节规则的registration_date列
生成符合增长趋势与季节因素的注册日期列
实现思路
- 先明确目标时间区间内的所有月份,按规则计算每个月应分配的用户数量(满足逐月1%-10%增长,每年12月环比下降10%-15%)
- 为每个月份生成对应数量的随机日期
- 将所有日期打乱后分配给数据集的
registration_date列,确保每个用户对应唯一注册日期
代码实现
import pandas as pd import numpy as np from datetime import datetime # 总用户数取现有数据集的记录量 total_users = df.shape[0] # 1. 生成目标时间范围内的所有月份列表 date_range = pd.date_range(start='2021-01-01', end='2023-02-28', freq='MS') months = [date.strftime('%Y-%m') for date in date_range] # 2. 计算每个月的用户数量 monthly_counts = [] # 初始化首月用户数,按总用户数平均分配后调整,确保最终总和匹配 initial_count = total_users // len(months) current_count = initial_count for month in months: year, mon = map(int, month.split('-')) if mon == 12: # 12月环比下降10%-15% drop_rate = np.random.uniform(0.1, 0.15) next_count = int(current_count * (1 - drop_rate)) else: # 其他月份环比增长1%-10% growth_rate = np.random.uniform(0.01, 0.1) next_count = int(current_count * (1 + growth_rate)) monthly_counts.append(current_count) current_count = next_count # 调整最后一个月的数量,确保总和等于总用户数 monthly_counts[-1] += total_users - sum(monthly_counts) # 3. 生成每个月的随机日期 registration_dates = [] for i, month in enumerate(months): year, mon = map(int, month.split('-')) # 获取当月的第一天和最后一天 start_date = datetime(year, mon, 1) end_date = datetime(year, mon+1, 1) - pd.Timedelta(days=1) if mon !=12 else datetime(year, 12, 31) # 生成对应数量的随机日期 dates = pd.date_range(start=start_date, end=end_date, periods=monthly_counts[i]) registration_dates.extend(dates) # 4. 打乱日期并分配给df np.random.shuffle(registration_dates) df['registration_date'] = registration_dates
关键细节说明
- 用户数校准:最后调整最后一个月的用户数,保证总数量和数据集记录数完全匹配
- 日期随机性:用
pd.date_range的periods参数生成均匀分布的随机日期,若需要更离散的随机分布,可替换为np.random.choice生成日期数组 - 季节因素处理:单独判断12月并应用下降比例,其他月份统一执行增长逻辑
内容的提问来源于stack exchange,提问作者nadavb
相关产品推荐
相关产品推荐

