如何用Python生成含指定日期范围的1000万行随机数据集?
Python生成1000万行指定日期范围的随机数据集
针对1000万行的大数据量,推荐结合numpy和pandas实现,兼顾效率和内存控制,以下是具体方案:
核心思路
- 将指定日期范围转换为时间戳数值,用numpy生成该区间内的随机时间戳,再转回日期格式
- 按需生成其他随机列(整数、字符串等)
- 分块写入文件,避免一次性加载1000万行数据导致内存溢出
代码实现
import numpy as np import pandas as pd from datetime import datetime # 配置参数 START_DATE = "2021-01-01" END_DATE = "2021-12-31" TOTAL_ROWS = 10_000_000 CHUNK_SIZE = 100_000 # 每次写入10万行,可根据内存调整 OUTPUT_FILE = "large_random_dataset.csv" # 把日期转为时间戳(单位:秒) start_ts = datetime.strptime(START_DATE, "%Y-%m-%d").timestamp() end_ts = datetime.strptime(END_DATE, "%Y-%m-%d").timestamp() # 分块生成并写入数据 with open(OUTPUT_FILE, "w", newline="") as f: # 写入表头 header = ["date_col", "random_int", "random_str"] pd.DataFrame(columns=header).to_csv(f, index=False, header=True) for _ in range(TOTAL_ROWS // CHUNK_SIZE): # 生成随机日期列 random_ts = np.random.uniform(start_ts, end_ts, CHUNK_SIZE) date_col = pd.to_datetime(random_ts, unit="s").date # 生成其他随机列 random_int = np.random.randint(1, 1000, size=CHUNK_SIZE) # 生成3位随机字母字符串 random_str = np.array([ ''.join(np.random.choice(list('abcdefghijklmnopqrstuvwxyz'), 3)) for _ in range(CHUNK_SIZE) ]) # 组装数据并写入 chunk_df = pd.DataFrame({ "date_col": date_col, "random_int": random_int, "random_str": random_str }) chunk_df.to_csv(f, index=False, header=False) # 处理剩余行数(若总行数不是CHUNK_SIZE的整数倍) remaining_rows = TOTAL_ROWS % CHUNK_SIZE if remaining_rows > 0: random_ts = np.random.uniform(start_ts, end_ts, remaining_rows) date_col = pd.to_datetime(random_ts, unit="s").date random_int = np.random.randint(1, 1000, size=remaining_rows) random_str = np.array([ ''.join(np.random.choice(list('abcdefghijklmnopqrstuvwxyz'), 3)) for _ in range(remaining_rows) ]) chunk_df = pd.DataFrame({ "date_col": date_col, "random_int": random_int, "random_str": random_str }) chunk_df.to_csv(f, index=False, header=False)
优化说明
- 内存控制:通过分块写入,每次仅在内存中保留10万行数据,避免内存过载
- 日期生成效率:用numpy直接生成时间戳再转换,比循环生成单个日期快得多
- 数据类型优化:可指定列的dtype减少内存占用,比如将
random_int改为np.random.randint(1, 1000, size=CHUNK_SIZE, dtype=np.int32)
扩展调整
- 如需更多列,直接在DataFrame中添加对应的numpy随机数组即可
- 若要生成带具体时间的日期,去掉
.date属性即可 - 字符串列可根据需求调整规则,比如固定前缀加随机数字等
内容的提问来源于stack exchange,提问作者Kamran Sadigli
相关产品推荐
相关产品推荐

