【开源】分享2011-2015年全国城市历史天气数据库【Sqlite+C#访问程序】

简介:

    由于个人研究需要,需要采集天气历史数据,前一篇文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子),介绍了基本的采集思路和核心代码,经过1个星期的采集,历史数据库基本全了,现在开放该数据库,目的是为了让可能需要该类型做相关研究准备的,至于实时天气的采集本项目也做了,暂时不公布,如果有需求的,单独好我联系,原因很简单,人家小站也不容易,大家一起拖,容易搞死,主要大家都不能用。

.NET开源项目:【目录】本博客其他.NET开源项目文章目录 

本文原文地址:分享2011-2015年全国城市历史天气数据库【Sqlite+C#访问程序】 

1.天气数据库介绍

    该数据的基本情况如下:

  • 该数据库目前覆盖了全国34个省、直辖市、自治区以及特别行政区的所有县级市区。

  • 该数据库的历史天气时间范围是2011年1月至2015年8月底的数据,实时天气预报的更新接口暂时不开放,但我们会对核心采集进行简单的介绍,请看第3节内容。

  • 包括的天气数据有:天气情况,气温情况,风力情况。

  • 目前总的天气记录条数为390万,,大小为570M,压缩后的版本大小为60M,后续还会增加,考虑每2-3个月更新一次。目前为一个总库

  • 考虑到实际的城市等级,我对省份和城市进行了大概分级,具体研究分析的时候可以自己单独提取城市,单独处理。

  1.省、直辖市、自治区,特别行政区,等级:1

  2.地级市,或者同等州 ,等级:2

  3.县市区,等级:3

  4.省会中心城市:5

    本文使用C#+XCode进行开发,大部分查询方法都在实体类中写好了。下面我们将会简单介绍一些。

2.数据库设计

    该数据库设计比较简单,第一个表是基础城市信息表,存储城市的名称,等级,代码,所属省份以及地区等基本信息;第二个表是原始天气数据表,存储采集过来的原始天气信息,主要信息是名称,天气状况,考虑到数据小,对一些字段进行了冗余,避免重复查找。第三个表是处理后的天气数据表,如何处理看个人情况进行,我自己还没想好,只是先采集了原始数据。数据库的结构如下图:

    上述3个表的基本结构看上面,比较简单,有的表字段进行了冗余,没必要为了所谓的范式把自己搞死。看看下面Gif动态演示图:

3.关于采集预报信息

  我们在前面一篇文章中介绍了基本的页面采集方法。页面分析过程就不介绍了,有空的朋友看前一篇文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子),这里直接贴出核心代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//直接采集月份,每个城市从2011 01 开始的数据至今都有
String url = String.Format( "http://www.tianqihoubao.com/yubao/{0}.html" , cityName);
//先要拼接链接,根据名称                
var  docText = HtmlHelper.GetWebClient(url);
var  doc =  new  HtmlDocument(); doc.LoadHtml(docText);
var  res = doc.DocumentNode.SelectSingleNode( @"/html[1]/body[1]/div[2]/div[6]/div[1]/div[1]/table[1]" );
if  (res !=  null )
{
     var  dd = res.SelectNodes( @"tr" );
     if  (dd.Count < 3)  return ; //3或者4个以上子节点tr
     if  ((dd.Count - 1) % 2 == 0)  //tr成对出现
     {
         Int32 N = (dd.Count - 1) / 2;
         for  ( int  i = 0; i < N; i++)
         {
             //日期 - 天气状况 - 气温 - 风力风向
             //白天
             var  td = dd[2 * i + 1].SelectNodes( @"td" );
             var  date = td[0].InnerText.Replace( "&nbsp;" "" ).Trim();
             var  btq = td[2].InnerText.Replace( "&nbsp;" "" ).Trim();
             var  bqw = td[3].InnerText.Replace( "&nbsp;" "" ).Trim();
             var  bfx = td[4].InnerText.Replace( "&nbsp;" "" ).Trim();
             //晚上
             var  tdw = dd[2 * i + 2].SelectNodes( @"td" );
             var  wtq = tdw[1].InnerText.Replace( "&nbsp;" "" ).Trim();
             var  wqw = tdw[2].InnerText.Replace( "&nbsp;" "" ).Trim();
             var  wfx = tdw[3].InnerText.Replace( "&nbsp;" "" ).Trim();
             Console.WriteLine( "{0}/{1},{2}/{3},{4}/{5},{6}" , wtq, btq, wqw, bqw, wfx, bfx,date);
         }
     }      
}

4.基本使用方法

    下面给出数据库的几个常规查询方法,如果懂XCode的朋友,更加容易理解,熟悉表结构就行了。

4.1 查询某个省份所有地级市列表

  由于地级市的等级为2或者5,所以要注意一些,而且县级市的省份属性里面也包括了Province,因此不能单独判定。

1
2
3
4
5
6
7
8
9
10
/// <summary>查询某个省份,所有地级市列表</summary>
/// <param name="provinceName">省份名称</param>
/// <returns></returns>
public  static  EntityList<BaseCityInfo> FindAllCityByProvince(String provinceName)
{
     return  BaseCityInfo.FindAll(
            BaseCityInfo._.Province == provinceName &
                BaseCityInfo._.Level>1 &  //不能为省份
                BaseCityInfo._.Level !=3); //要包括省会中心城市,也就是Level=2或者5
}

4.2 查询地级市下所有县市列表

  县级市都是等级为3,所以查询地区名称以及等级就可以了。

1
2
3
4
5
6
7
8
/// <summary>查询某个地级市下面的所有县级市列表</summary>
/// <param name="areaName">市区名称</param>
/// <returns></returns>
public  static  EntityList<BaseCityInfo> FindAllCityByArea(String areaName)
{
     return  BaseCityInfo.FindAll(BaseCityInfo._.Area == areaName &
                 BaseCityInfo._.Level ==3); //Level=3是县级市区
}

4.3 查询某个地区某个月的天气情况

  查询某个地区,和时间范围的天气情况,直接加条件即可,地区按照名称来XCode的查询语法举一反三,应该比较好理解。

1
2
3
4
5
6
7
8
9
10
11
/// <summary>查询某个地区某个月的天气情况</summary>
/// <param name="cityName">城市名称</param>
/// <returns></returns>
public  static  EntityList<OriginWeatherData> FindCityWeatherByMonth(String cityName)
{
     return  OriginWeatherData.FindAll(
            OriginWeatherData._.Name == cityName &
            OriginWeatherData._.DateTime <=  new  DateTime(2015, 8, 31)&
            OriginWeatherData._.DateTime >= new  DateTime (2015,8,1),
            OriginWeatherData._.DateTime.Asc(), null ,0,0);
}<br><br>

4.4 数据库Sql查询演示与XCode版代码

  为了更加直观,我们对数据库进行了简单的查询演示,390万代码实际速度并不慢,看看效果。里面的Sql语句,下面都将使用XCode代码进行重写演示,大家可以借鉴用法:

 我们看看XCode的查询方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//获取所有的地级市+县级市区的数量
var  cityCount = BaseCityInfo.FindCount(BaseCityInfo._.Level > 1,  null null , 0, 0);
//获取所有记录总数,截至时间2015-08-29和2015-09-03
var  totalCount = OriginWeatherData.FindCount();
//获取从2015-08-21开始的上海地区的天气情况
var  shanghaiRecords = OriginWeatherData.FindAll
                         (OriginWeatherData._.Name ==  "上海"  &
                          OriginWeatherData._.DateTime >  new  DateTime(2015, 08, 20),
                          OriginWeatherData._.Id.Asc(),  null , 0, 0);
//获取上海地区总的天气数目,注意只是上海地区总的,不包括下属县市区
var  shCount = OriginWeatherData.FindCount(OriginWeatherData._.Name,  "上海" );
//获取浙江省地级市区所有的天气记录 
var  zjRecords = OriginWeatherData.FindAll
                     (OriginWeatherData._.Province ==  "浙江"  &
                     (OriginWeatherData._.Level == 2 | 
                      OriginWeatherData._.Level == 5),
                      null , null ,0,0);
//获取2015年8月20日浙江省地级市区所有的天气记录
var  zj = OriginWeatherData.FindAll
                     (OriginWeatherData._.Province ==  "浙江"  &
                      OriginWeatherData._.DateTime >  new  DateTime(2015, 08, 20) &
                      (OriginWeatherData._.Level == 2 | OriginWeatherData._.Level == 5),
                      null null , 0, 0);

 看看结果:

 

5.数据库和程序下载

    Sqlite版数据库下载:http://pan.baidu.com/s/1pJ02EmR 密码:jzmt ,

 如果链接错误,请到原地址下载:分享2011-2015年全国城市历史天气数据库【Sqlite+C#访问程序】 

    C#版访问程序,注意是Sqlite是32位的版本:天气数据库访问程序.rar

 使用方法:把数据库放在bin目录,或者自己修改配置文件的地址。

  数据大部分截至2015年8月30日-2015年9月2日,按照地区会有不一样,以后会逐步同步起来。

    核心代码不直接开放,但完全免费对有需要的人开放。需要的人可以QQ联系,或者邮件联系我,请注明自己的一些基本个人信息和用途。

    由于时间紧,考虑不够全面,我将在下一个版本中对数据库进行分库,提高数据查询效率。目前的数据库对于sqlite版本来说,太大了,而且以后还会持续增加,如果有资源的朋友,可以帮忙挂一下。


本文转自叶小钗 h数据之巅博客园博客,原文链接:http://www.cnblogs.com/asxinyu/p/CSharp_HtmlAgilityPack_XPath_China_Weather_Data.,如需转载请自行联系原作者

目录
打赏
0
0
0
0
15
分享
相关文章
PolarDB开源数据库进阶课17 集成数据湖功能
本文介绍了如何在PolarDB数据库中接入pg_duckdb、pg_mooncake插件以支持数据湖功能, 可以读写对象存储的远程数据, 支持csv, parquet等格式, 支持delta等框架, 并显著提升OLAP性能。
57 1
PolarDB开源数据库进阶课11 激活容灾(Standby)节点
本文介绍了如何激活PolarDB容灾(Standby)节点,实验环境依赖于Docker容器中用loop设备模拟共享存储。通过`pg_ctl promote`命令可以将Standby节点提升为主节点,使其能够接收读写请求。激活后,原Standby节点不能再成为PolarDB集群的Standby节点。建议删除对应的复制槽位以避免WAL文件堆积。相关操作和配置请参考系列文章及视频教程。
36 1
PolarDB开源数据库进阶课5 在线备份
本文介绍了如何在PolarDB RAC一写多读集群中进行在线备份,特别针对共享存储模式。通过使用`polar_basebackup`工具,可以将实例的本地数据和共享数据备份到本地盘中。实验环境依赖于Docker容器中用loop设备模拟的共享存储。
35 1
PolarDB开源数据库进阶课15 集成DeepSeek等大模型
本文介绍了如何在PolarDB数据库中接入私有化大模型服务,以实现多种应用场景。实验环境依赖于Docker容器中的loop设备模拟共享存储,具体搭建方法可参考相关系列文章。文中详细描述了部署ollama服务、编译并安装http和openai插件的过程,并通过示例展示了如何使用这些插件调用大模型API进行文本分析和情感分类等任务。此外,还探讨了如何设计表结构及触发器函数自动处理客户反馈数据,以及生成满足需求的SQL查询语句。最后对比了不同模型的回答效果,展示了deepseek-r1模型的优势。
98 0
PolarDB开源数据库进阶课14 纯享单机版
PolarDB不仅支持基于“共享存储+多计算节点”的集群版,还提供类似开源PostgreSQL的单机版。单机版部署简单,适合大多数应用场景,并可直接使用PostgreSQL生态插件。通过Docker容器、Git克隆代码、编译软件等步骤,即可完成PolarDB单机版的安装与配置。具体操作包括启动容器、进入容器、克隆代码、编译软件、初始化实例、配置参数及启动数据库。此外,还有多个相关教程和视频链接供参考,帮助用户更好地理解和使用PolarDB单机版。
43 0
PolarDB开源数据库进阶课13 单机版转换为集群版
本文介绍如何将“本地存储实例”转换为“共享存储实例”,依赖于先前搭建的实验环境。主要步骤包括:准备PFS二进制文件、格式化共享盘为pfs文件系统、启动pfsd服务、停库并拷贝数据到pfs内、修改配置文件,最后启动实例。通过这些操作,成功实现了从本地存储到共享存储的转换,并验证了新实例的功能。相关系列文章和视频链接提供了更多背景信息和技术细节。
22 0
PolarDB开源数据库进阶课7 实时流式归档
本文介绍了如何在PolarDB RAC一写多读集群中实现实时归档,确保WAL日志的及时备份。实验依赖于Docker容器和loop设备模拟的共享存储环境。通过配置主节点的`pg_hba.conf`、创建复制槽以及使用`pg_receivewal`工具,实现实时接收并归档WAL文件。此外,还提供了详细的命令行帮助和相关文档链接,方便读者参考和操作。注意:如果已搭建容灾节点,则无需重复进行实时归档。
13 0
PolarDB开源数据库进阶课2 创建容灾(standby)节点
本文介绍了如何在macOS中搭建PolarDB的容灾(standby)节点,作为“穷鬼玩PolarDB RAC一写多读集群”系列的一部分。基于前一篇通过Docker和loop设备模拟共享存储的经验,本文详细描述了创建虚拟磁盘、启动容器、配置网络、格式化磁盘、备份数据及配置standby节点的具体步骤。
29 0
喜报|PolarDB开源社区荣获“2024数据库国内活跃开源项目”奖
喜报|PolarDB开源社区荣获“2024数据库国内活跃开源项目”奖
PolarDB开源数据库进阶课12 集群版转换为单机版
本文介绍了如何将“共享存储实例”转换为“本地存储实例”,实验环境依赖于Docker容器中的loop设备模拟共享存储。具体步骤包括准备本地目录、停库、拷贝数据、修改配置文件并启动实例。通过这些操作,可以实现从共享存储到本地存储的平滑转换。相关系列文章详细记录了PolarDB RAC一写多读集群的搭建与管理,提供了丰富的实战经验。
26 3

热门文章

最新文章