简介:这份数据包完整收录了双色球从2003年2月23日首期开售到2025年4月15日期间全部3287期开奖号码,每一期均包含期号、开奖日期、六个红球和一个蓝球,字段清晰无缺失,适合数据分析初学者、开发者和彩票研究者使用。资源包一共5个文件,Excel文件可直接进行筛选、排序和图表分析,SQL文件可导入MySQL做批量查询、频次统计、冷热号追踪,同时附带Python脚本和辅助配置文件,整体压缩后仅213KB,下载后即可快速开始分析。数据已按时间顺序整理,无重复、无遗漏,可以支撑连号走势、区间分布、奇偶比等特征分析,也能作为自建预测模型的训练输入。目前已有1269人学习下载,是一份便于复盘双色球历史开奖规律、开展数据探索的高质量底表。 双色球开奖数据从2003年第一期到2025年,一共3287期完整记录,整理成Excel和MySQL两个版本——这个活儿听起来简单,但真正做过的人都知道坑不少。我花了几天时间把数据全部核了一遍,按双色球的实际期号规则和开奖字段切分好,顺手把Excel和MySQL导入的踩坑过程也记录下来。这篇博文就把这套数据的整理思路、文件结构、导入细节和常见问题全部摊开讲,适合正在学Excel数据分析、需要一份练手数据集做可视化、或者想熟悉MySQL建表和导入流程的朋友,可以直接照着做。
很多人问我要这类数据的时候,其实并不知道自己拿回去要干什么。有人想练Excel函数,有人想学MySQL多表查询,有人只是想画个红球蓝球频率图表。不管哪种目的,一份可靠、干净、字段规范的数据文件,比什么都重要。而双色球这个彩种,从2003年上市到现在,规则基本稳定,字段也足够典型,是练习数据处理的一个好素材。
1. 这3287期数据从哪来,怎么保证靠谱
1.1 期数口径与数据来源
双色球每周开奖三期,一年大致150期左右。2003年第一期从2003001开始编号,到2025年,中间偶尔因为春节休市少开几期,累计下来就是3287期。这个数字不是拍脑袋算出来的,是逐期核对的最终结果。
数据来源我的建议是:官方历史开奖公告 + 主流彩票数据平台交叉校验。两个来源各自导出一份,然后按期号做逐期比对,红球、蓝球、日期完全一致才算通过。如果你只从一个来源抓数据,出现过期、错号、重复的情况不要觉得奇怪,人工录入哪有什么百分之百,交叉验证是唯一的出路。
1.2 数据字段设计与清洗规则
这套数据文件的字段设计如下表所示,也是我最终交付的版本:
| 字段名 | 字段类型 | 说明 |
|---|---|---|
| issue | 文本/字符串 | 开奖期号,格式如2003001 |
| open_date | 日期 | 开奖日期,标准为YYYY-MM-DD |
| red1 ~ red6 | 整数 | 6个红球号码,按从小到大排列 |
| blue | 整数 | 蓝球号码 |
| sales | 长整数 | 当期销售额(元) |
| pool_money | 长整数 | 奖池累计金额(元) |
| first_prize_count | 整数 | 一等奖注数 |
| first_prize_money | 长整数 | 一等奖单注奖金(元) |
数据清洗时有几个关键约定:
- 红球顺序必须从小到大排列,且每期6个红球互不重复;
- 期号采用双色球官方编号格式,不是简单递增数字;
- 日期统一转成标准的YYYY-MM-DD,避免Excel自动解析把格式搞乱;
- 销售额、奖池金额这类数值字段,在Excel里需要设置成常规或数值格式,不要保留千分符,不然MySQL导入会报错。
这套清洗规则直接决定了后面Excel能不能透视、MySQL能不能导入,一步做错,后面全崩。
2. Excel数据文件:给非技术人员准备的"即开即用"
2.1 表格结构设计
Excel文件我拆了两个Sheet。第一个Sheet叫"全部数据",就是上面字段的完整记录,3287行,带冻结首行、自动筛选、条件格式。第二个Sheet叫"使用说明",把每个字段的含义、常见问题、怎么用数据透视表统计红球频率写清楚了。对新手来说,这个说明Sheet比数据本身还有用。
这里有一个很多人都会踩的坑:红球和蓝球如果直接写成数字1、2、3这种整数,在Excel中显示"1"没问题,可一旦你在公式里拼接字符串或者做VLOOKUP,就会发现"2003001"和"1"不是一回事。另外如果号码是两位数,比如"01"写成"1",数据本身没变,但视觉上容易让人看错。解决方案是:给这两个字段设置自定义格式"00",号码显示为01、02、09,但单元格存储的还是数字。
2.2 Excel里能直接做什么
拿到这份Excel文件,不需要额外工具就能做不少事情。
数据分析师最常用的就是数据透视表。选中全部数据,插入透视表,把"red1"到"red6"全部放到行区域,值区域用计数,就能快速看出每个红球号码整体出现的频次。蓝球频次也同理。要注意的是,透视表会把不同位置的同一个号码当成不同字段来统计,也就是说红球01出现在red1、red2、red3……都是不同的"字段",所以不能直接拉red1这一个字段代表红球所有位置。正确做法是把6个红球列合并成一列(用Power Query或者直接复制粘贴),再做透视。
另外Excel的筛选功能也可以直接用。比如想看2024年所有开奖记录,点开日期列的下拉菜单,年份勾选2024就行。想看某几个特定期号,在期号列搜索对应数字前缀即可。对只是想随手查一查数据的人来说,这份Excel文件比接数据库要方便太多。
3. MySQL数据入库:技术党拿来就能跑
3.1 建表SQL设计
Excel给非技术人员用,MySQL给程序员用。我根据上面字段设计了一套建表SQL,直接复制到MySQL就可以执行:
CREATE TABLE `ssq_history` ( `id` int NOT NULL AUTO_INCREMENT, `issue` varchar(10) NOT NULL COMMENT '期号,如2003001', `open_date` date NOT NULL COMMENT '开奖日期', `red1` tinyint NOT NULL COMMENT '红球1', `red2` tinyint NOT NULL, `red3` tinyint NOT NULL, `red4` tinyint NOT NULL, `red5` tinyint NOT NULL, `red6` tinyint NOT NULL, `blue` tinyint NOT NULL COMMENT '蓝球', `sales` bigint DEFAULT NULL COMMENT '销售额(元)', `pool_money` bigint DEFAULT NULL COMMENT '奖池金额(元)', `first_prize_count` int DEFAULT NULL COMMENT '一等奖注数', `first_prize_money` bigint DEFAULT NULL COMMENT '一等奖单注奖金(元)', PRIMARY KEY (`id`), UNIQUE KEY `uk_issue` (`issue`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='双色球历史开奖数据';字段类型选择上,红球蓝球的取值范围是1~33、1~16,TINYINT完全够用;期号虽然是数字,但建议用VARCHAR存储,因为实际使用中经常需要拼接字符串或者做前模糊查询(比如查2024年的所有期号就是LIKE '2024%'),用整数类型反而别扭;金额字段用BIGINT,避免溢出。
唯一索引建在issue上,这是整张表最重要的约束。双色球期号天然唯一,有这个索引在,重复导入数据时数据库会直接拦截,避免脏数据。
3.2 数据导入的三种路径
我在这套文件里附带了一个Python导入脚本(放在mysql_import目录下),同时在这里把几种导入方案都列出来,你根据自己的环境选一种就行。
方案一:Python + pymysql 分批读取Excel插入
import pymysql import pandas as pd from sqlalchemy import create_engine df = pd.read_excel('ssq_2003_2025.xlsx', sheet_name='全部数据') # 把空值转成None,避免MySQL插入时把空字符串当成0 df = df.where(pd.notnull(df), None) engine = create_engine('mysql+pymysql://root:your_password@localhost:3306/test?charset=utf8mb4') df.to_sql('ssq_history', con=engine, if_exists='append', index=False)这段代码省事的地方在于pandas的to_sql会自动拼接INSERT语句,字段顺序和类型都帮你处理好了。跑之前必须先建好表,且Excel的列名要和表字段名一一对应,否则会报字段不存在的错。
方案二:MySQL的LOAD DATA LOCAL INFILE
如果你的环境允许,直接加载CSV格式性能最高:
LOAD DATA LOCAL INFILE '/path/ssq_data.csv' INTO TABLE ssq_history FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES (issue, open_date, red1, red2, red3, red4, red5, red6, blue, sales, pool_money, first_prize_count, first_prize_money);用这个命令之前,CSV文件必须经过编码预处理,统一转成UTF-8。如果是Windows下用Excel另存的CSV,大概率是GBK编码,需要在导入前先转码,否则中文注释字段会乱码。
3.3 导入后的数据校验
数据入库不等于万事大吉,导入完成后必须做校验,不然分析到一半发现期数对不上,哭都来不及。
校验三板斧:
-- 1. 总期数核对 SELECT COUNT(*) FROM ssq_history; -- 2. 期号连续性检查(查询中间有没有跳号) SELECT issue, open_date FROM ssq_history WHERE issue NOT IN ( SELECT CONCAT(LEFT(issue, 4), LPAD(CAST(RIGHT(issue, 3) AS UNSIGNED) - 1, 3, '0')) FROM ssq_history ); -- 3. 重复检查 SELECT issue, COUNT(*) FROM ssq_history GROUP BY issue HAVING COUNT(*) > 1;第一句看总数是否等于3287;第二句检查期号有没有断档;第三句基于唯一索引做重复性验证。我自己实际操作的时候,这三条SQL一跑,基本能发现95%以上的数据问题。
4. 踩坑实录:从Excel到MySQL,最容易被卡住的几个问题
4.1 期号前导零与科学计数法的坑
这是Excel数据文件最容易出的问题。2003001这类期号在Excel里如果按常规格式输入,会变成2003001,没问题。但如果有人把期号录成"2003-001"或者改成日期格式,显示就会错乱成一串日期。用户在Excel里看到2003/1/1,以为是日期,实际上就是期号被Excel自动识别成日期了。
此外,如果数据里有超过11位的数字(比如销售额几十亿),Excel会默认转成科学计数法,显示成2.03E+09。这种数据一旦导出成CSV,就会丢失精度,导入MySQL后数值对不上。解决办法是:在Excel里给销售额、奖池金额列设置"数值"格式,小数位为0,或者使用千分分隔符以外的标准数字格式。
4.2 日期格式不统一导致MySQL报错
不同渠道下载的数据,日期格式五花八门:2024-01-01、2024/01/01、20240101、2024年1月1日……如果直接存进DATE字段,MySQL只认第一种格式,其他的要么报错要么存成0000-00-00。
我在整理数据时把日期全部转成了标准格式。如果你拿到的是非标准日期,在Excel里可以先用分列功能处理:选中日期列 -> 数据 -> 分列 -> 下一步 -> 选择"日期"(MDY格式) -> 完成。分列完后日期就统一了。
4.3 LOAD DATA导入时出现"Data truncated for column"错误
这个错本质上是字段长度或类型不匹配。红球列如果Excel单元格里混入了空格或文本,LOAD DATA在做数值转换时会报"Data truncated"。排查思路是:用Excel先做一次文本清洗,把要导入的列全部转成纯数字。也可以导入CSV前先用awk或者Python做一次类型检查,把非数字单元格全部找出来。
4.4 数据库连接时Authentication Plugin报错
MySQL 8默认的密码认证插件是caching_sha2_password,老代码如果用旧版mysql_native_password连接,可能报Authentication plugin 'caching_sha2_password' cannot be loaded。这种情况在Python的pymysql、旧版本JDBC驱动里都出现过。
处理方法有两种:一是升级连接驱动到你当前MySQL版本对应的最新版;二是在MySQL里把账号认证插件改回来:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES;说实话我推荐的还是第一种,升级驱动,毕竟新版MySQL用原生密码插件是趋势,改认证方式只能算临时解决方案。
4.5 数据分析时发现期数对不上
有位朋友导入完成后,一查COUNT(*)只有3268期,少了19期。排查到最后,是春节休市搞的鬼。双色球每年春节前会休市一周左右,这期间没有开奖数据。2003年至今,累计休市期数就是十几期,这是正常现象,不是数据丢失。遇到这种情况,我一般建议拿每年实际开奖期数做一次分组统计,和官方公布的年度开奖期数核对,如果一致就说明数据没缺。
5. 拿这份数据能做什么:应用场景扩展
5.1 数据可视化:红球蓝球频率分析
数据可视化是这份数据最常见的应用场景。把3287期所有红球号码和蓝球号码展开成明细,统计每个号码的出现次数,再用Excel条件格式或Python的Matplotlib画成柱状图,能直观看出号码分布是否均匀。
实际操作中有个细节:如果你在Excel里画红球频率图,别只统计red1列,要把red1到red6合并成一个"所有红球"列再统计。蓝球则可以直接统计blue列,因为蓝球只有一个。我用这份数据画过图,红球号码整体分布比较均匀,但局部会有小波动,这个其实符合随机抽样的特征。
5.2 SQL练习的好素材
对于初学者来说,这份3287行的数据量不大不小,非常适合练习SQL。你可以试着跑这些查询:
-- 按年份统计一等奖注数之和 SELECT YEAR(open_date) AS year, SUM(first_prize_count) AS total_prizes FROM ssq_history GROUP BY YEAR(open_date) ORDER BY year; -- 找出所有开奖日期为周六的期号 SELECT issue, open_date FROM ssq_history WHERE DAYOFWEEK(open_date) = 7; -- 统计每个蓝球号码在2024年出现的次数 SELECT blue, COUNT(*) AS cnt FROM ssq_history WHERE YEAR(open_date) = 2024 GROUP BY blue ORDER BY cnt DESC;这类查询覆盖了YEAR、DAYOFWEEK、GROUP BY、ORDER BY等常用语法,练完基本就能应付大多数初级数据分析需求。
5.3 与业务数据关联做进一步分析
如果你手头有其他维度的数据,比如各省份销量数据、当期天气、节假日等,可以通过期号字段与这份开奖数据做关联。比如分析春节休市前后销售额的变化趋势,或者对比周四周周日开奖的销售额差异,这些分析在Excel里用VLOOKUP就能实现,在SQL里用JOIN更直接。
我记得有一次帮朋友做"各年度双色球销售额变化趋势"分析,数据从这份表里直接按年份聚合就行,非常顺畅。这类经验说明,好的数据文件不是存起来吃灰的,而是拿来扩展分析的基础。
6. 更新数据时的一些个人建议
这套文件目前覆盖到2025年,共3287期。实际使用中每隔一段时间需要追加新开奖数据。我的建议是维护一个"增量更新脚本",每次把新期数的数据按相同格式追加到Excel和MySQL中,而不是整体重新导入。避免因为某一年规则调整、期号重新编号导致整体数据出错。
更新时有一点要特别留意:双色球偶尔会有开奖时间调整(比如春节休市、国庆期间的调休),如果直接从网上抓取数据,很可能把"休市"误判为"数据缺失"。稳妥做法是每抓取一批新的期号后,用MAX(issue)和官方公告对比一次,确认最新的期号没有断档。
另外说句经验之谈:无论Excel还是MySQL,务必给原始数据做过一次备份。我见过好几个人在导入过程中误操作把整张表清空,靠备份才救回来。数据整理这种工作,花在备份上的时间永远值得。
本文还有配套的精品资源,点击获取