【開源】分享2011-2015年全國城市歷史天氣資料庫【Sqlite+C#訪問程式】
由於個人研究需要,需要採集天氣歷史資料,前一篇文章:C#+HtmlAgilityPack+XPath帶你採集資料(以採集天氣資料為例子),介紹了基本的採集思路和核心程式碼,經過1個星期的採集,歷史資料庫基本全了,現在開放該資料庫,目的是為了讓可能需要該型別做相關研究準備的,至於實時天氣的採集本專案也做了,暫時不公佈,如果有需求的,單獨好我聯絡,原因很簡單,人家小站也不容易,大家一起拖,容易搞死,主要大家都不能用。
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.關於採集預報資訊
//直接採集月份,每個城市從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(" ", "").Trim(); var btq = td[2].InnerText.Replace(" ", "").Trim(); var bqw = td[3].InnerText.Replace(" ", "").Trim(); var bfx = td[4].InnerText.Replace(" ", "").Trim(); //晚上 var tdw = dd[2 * i + 2].SelectNodes(@"td"); var wtq = tdw[1].InnerText.Replace(" ", "").Trim(); var wqw = tdw[2].InnerText.Replace(" ", "").Trim(); var wfx = tdw[3].InnerText.Replace(" ", "").Trim(); Console.WriteLine("{0}/{1},{2}/{3},{4}/{5},{6}", wtq, btq, wqw, bqw, wfx, bfx,date); } } }
4.基本使用方法
下面給出資料庫的幾個常規查詢方法,如果懂XCode的朋友,更加容易理解,熟悉表結構就行了。
4.1 查詢某個省份所有地級市列表
由於地級市的等級為2或者5,所以要注意一些,而且縣級市的省份屬性裡面也包括了Province,因此不能單獨判定。
/// <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,所以查詢地區名稱以及等級就可以了。
/// <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的查詢語法舉一反三,應該比較好理解。
/// <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); }
4.4 資料庫Sql查詢演示與XCode版程式碼
為了更加直觀,我們對資料庫進行了簡單的查詢演示,390萬代碼實際速度並不慢,看看效果。裡面的Sql語句,下面都將使用XCode程式碼進行重寫演示,大家可以借鑑用法:
我們看看XCode的查詢方法:
//獲取所有的地級市+縣級市區的數量 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.資料庫和程式下載
C#版訪問程式,注意是Sqlite是32位的版本:天氣資料庫訪問程式.rar
使用方法:把資料庫放在bin目錄,或者自己修改配置檔案的地址。
資料大部分截至2015年8月30日-2015年9月2日,按照地區會有不一樣,以後會逐步同步起來。
核心程式碼不直接開放,但完全免費對有需要的人開放。需要的人可以QQ聯絡,或者郵件聯絡我,請註明自己的一些基本個人資訊和用途。
由於時間緊,考慮不夠全面,我將在下一個版本中對資料庫進行分庫,提高資料查詢效率。目前的資料庫對於sqlite版本來說,太大了,而且以後還會持續增加,如果有資源的朋友,可以幫忙掛一下。
相關推薦
【開源】分享2011-2015年全國城市歷史天氣資料庫【Sqlite+C#訪問程式】
由於個人研究需要,需要採集天氣歷史資料,前一篇文章:C#+HtmlAgilityPack+XPath帶你採集資料(以採集天氣資料為例子),介紹了基本的採集思路和核心程式碼,經過1個星期的採集,歷史資料庫基本全了,現在開放該資料庫,目的是為了讓可能需要該型別做相關研究準備的,至於實時天氣的採集本專案
2015年全國谷歌衛星地圖離線資料儲存方案
一、概述 隨著地理資訊數字化的發展,大資料時代的到來,海量資料的傳輸和安全性給我們帶來巨大的困難。海量資料的傳輸受到網際網路技術和硬體的限制,佔用著較多的線上資源和線下儲存空間,產生了能源、空間、人力的成本浪費,而在資料傳輸和儲存過程中,不規範的操作造成的資料洩露,更是資
CSP考試 2015年9月第2題 日期計算 C語言實現
#include <stdio.h> int main() { //int nian=2000; //int ri=40; int nian; int ri; scanf("%d",&nian);/* if((nian<1900)|
CSP考試 2015年03月第2題 數字排序 C語言實現
#include <stdio.h> int main() { int NUM; scanf("%d",&NUM); int a[NUM]; int b[1001]; int i,j; for(i=0;i<NUM;i+
2015年第六屆藍橋杯試題(C/C++本科B組)
1 有些人很迷信數字,比如帶“4”的數字,認為和“死”諧音,就覺得不吉利。雖然這些說法純屬無稽之談,但有時還要迎合大眾的需求。某抽獎活動的獎券號碼是5位數(10-99),要求其中不要出現帶“4”的號碼,主辦單位請你計算一下,如果任何兩張獎券不重號,最多可發出獎券多少張。 請
最新2010年全國城市GDP排行前100名
排名城市 2010年gdp 所屬省份1 上海 16872.42 上海2 北京 13777.90 北京3 廣州 10604.48 廣東14 深圳 9510.91 廣東25 蘇州 9168.91 江蘇16 天津 9108.83 天津7 重慶 7894.24 重慶8 杭州 5945
2015年4月第六屆藍橋杯c/c++B組省賽試題和個人解答
又一年的藍橋杯,好久沒那麼爽快的做題了,昨天上午剛考完藍橋杯,我把題帶出來了。不廢話,上題。 一、 獎券數目 有些人很迷信數字,比如帶“4”的數字,認為和“死”諧音,就覺得不吉利。 雖然這些說法純屬無稽之談,但有時還要迎合大眾的需求。某抽獎活動的獎券號碼是5位數(
【開源分享:入門到精通ASP.NET MVC+EF6+Bootstrap】從這裏開始,一起搭框架(1)開篇介紹
strong src 擁有 ckeditor 開發 技術分享 mdi 控制 https 框架簡介 這幾年一直在做ASP.NET開發,幾年前做項目都是老老實實一行行的寫代碼,後來發現那些高手基本都會有自己積累起來的代碼庫,現在稱之為開發框架,基礎代碼不用再去堆,
【2018年全國多校算法寒假訓練營練習比賽(第三場)】
upload 線段 fall 警鐘 預處理 數學 tex sqrt -- 之前題目比較水,今天的還可以。 【A 不凡的大夫】 方法一:答案是log8(n!),解決方案是預處理,將需要的答案記錄下來以免超內存; 方法二:用公式,斯特林公式: 【B 一個小問
【2018年全國多校算法寒假訓練營練習比賽(第四場)-A】石油采集(匈牙利算法)
sca scanf tor 代碼 contest bit span 比賽 targe 試題鏈接:https://www.nowcoder.com/acm/contest/76/A 【思路】 每個‘#’的右邊和下邊如果也是‘#&r
【2018年全國多校算法寒假訓練營練習比賽(第四場)-D】小明的挖礦之旅
scanf n) name targe () 鏈接 算法 || 挖礦 題目鏈接:https://www.nowcoder.com/acm/contest/76/D做題時沒註意到“無論出現在哪個格子”。。題中也沒說明一個格子只能經過一次,其實沒有想象的
【2018年全國多校算法寒假訓練營練習比賽(第五場)-E】情人節的電燈泡(二維樹狀數組單點更新+區間查詢)
string 整數 改變 sin microsoft 題目 全國 次數 ros 試題鏈接:https://www.nowcoder.com/acm/contest/77/E 題目描述 情人節到了,小芳和小明手牽手,打算過一個完美的情人節,但是小剛偏偏也來了,當了一個
【2018年全國多校算法寒假訓練營練習比賽(第五場)-C】字符串問題(KMP)
長度 str lan sca include leg www tps bsp 題目鏈接:https://www.nowcoder.com/acm/contest/77/C 【題意】 求一個字符串中最長的子串,要求子串既是原串的前綴又是後綴,除前後綴還在中間出現過。
【大資料】InfoWorld的2018年最佳開源資料平臺獎公佈
目錄 TiDB Neo4j Apache Spark 儘管新的產品層出不窮,Apache Spark在資料分析領域仍然佔據著舉足輕重的地位。如果你需要從事分散式計算、資料科學或者機器學習相關的工作,就使用Apache
【結構之法 演算法之道】2015年起和團隊創業做七月線上,專注AI教育。希望一直不斷幫助天下最多人
博主簡介 July,湖南婁底人,於2010年10月11日開始在CSDN上寫博(搜尋:結構之法,進入本部落格),部落格專注面試、演算法、機器學習。2011年畢業於東華理工,2015年正式創業,任:七月線上創始人兼CEO,公司官網:七月線上(https://www.july
【題目】2016年全國研究生數學建模競賽B題 具有遺傳性疾病和性狀的遺傳位點分析
同學給我看了她參加競賽的題目,我一看,這不巧了嗎,我也就看看題目...... 人體的每條染色體攜帶一個DNA分子。在這條雙螺旋的長鏈中,共有約30億個鹼基對,而基因則是DNA長鏈中有遺傳效應的一些片段。在組成DNA的數量浩瀚的鹼基對(或對應的脫氧核苷酸)中,有一些特定位置
【今日薦文】三十五年經驗分享:程式設計師進階八法
如果你的目標僅僅是提高自己,那麼很容易實現,但是如果你的目標是成為一個偉大的程式設計師,那麼這就不簡單了。 很多人都願意說,我想變得更好,但是更好是什麼卻很模糊,而且人們也不知道該怎麼樣去做。 時間到了,提高你的程式設計技能,認真+嚴肅,走起! 我在這裡分享八法
【Bugly乾貨分享】那些年我們用過的顯示效能指標
注:Google 在自己文章中用了 Display Performance 來描述我們常說的流暢度,為了顯得有文化,本文主要用“顯示效能”一詞來代指“流暢度”(雖然兩者在概念上有細微差別)。 從 Android 誕生的那一刻起,流暢度就為眾人所關注。一
【讀書精華分享】《分散式實時處理系統 原理、架構與實現》盧譽聲著/2016年
【分享說明】: 我會花很多時間或淺或深的研讀一本書,然後總結一些提煉出來的精華,用簡短的語言,讓其他人能夠用很少的時間大致知道這本書能帶給自己的價值,如果適用自己,鼓勵買一本正本實體書細讀
【ZSTU4213 2015年12月浙理工校賽 D】【雙連通分量tarjan演算法】One-Way Roads 無向連通圖確定邊的方向使得全圖任意兩點間可達
4213: One-Way Roads Time Limit:1 Sec Memory Limit:128 MB Special JudgeSubmit:133 Solved:45 Description In the ACM kingdom, there a