当前位置: 首页 > 编程日记 > 正文

技术图文:如何爬取一个地区的气象数据(上)?

背景

架空线路主要指架空明线,架设在地面之上,是用绝缘子将输电导线固定在直立于地面的杆塔上以传输电能的输电线路。架设及维修比较方便,成本较低,但容易受到气象和环境(如大风、雷击、污秽、冰雪等)的影响而引起故障。

在对架空线路故障进行研究的时候,我们需要从网上爬取其所在位置的气象数据。

在爬取气象数据之前需要对爬取数据的网站进行分析,以邯郸地区为例:

2019年10月份天气数据的URL:

http://lishi.tianqi.com/handan/201910.html

2019年09月份天气数据的URL:

http://lishi.tianqi.com/handan/201909.html

以此类推,该网站可以获取邯郸地区2011年到2019年的全部数据,只要发现请求url地址的规律就可以自动化的下载这些数据了。本篇图文作为爬取数据的引导,先来介绍构造一个区间段日期的方法。


技术分析

1. datetime 模块简介

datetime是Python处理日期和时间的模块,该模块包含一个datetime类用来处理程序中遇到的日期和时间,还包含一个timedelta类,通过该类可以对datetime对象进行加减运算。

str转换为datetime

  • datetime.strptime(date_string, format)

Return a datetime corresponding to date_string, parsed according to format.

from datetime import datetimecday = datetime.strptime('2019-6-1 18:19:59', '%Y-%m-%d %H:%M:%S')
print(cday)# 2019-06-01 18:19:59

字符串'%Y-%m-%d %H:%M:%S'规定了日期和时间部分的格式。

%Y:四个数字表示的年份 2019

%y:两个数字表示的年份 19

%m:返回月份 范围[0,12]

%d:返回的是当前时间是当前月的第几天

%H:以24小时制表示当前小时

%I:以12小时制表示当前小时

%M:返回分钟数 范围 [0,59]

%S:返回秒数 范围 [0,61]

datetime转换为str

  • time.strftime(format)

Return a string representing the time, controlled by an explicit format string.

from datetime import datetime
now = datetime.now()
sday = now.strftime('%Y-%m-%d %H:%M:%S')
print(sday)# 2019-12-15 17:04:04

datetime加减

对日期和时间进行加减实际上就是把datetime往后或往前计算,得到新的datetime。加减可以直接用+-运算符,不过需要导入timedelta这个类:

from datetime import datetime, timedeltanow = datetime.now()
print(now)
print(now + timedelta(hours=10))
print(now - timedelta(days=1))
print(now + timedelta(days=2, hours=12))# 2019-12-15 17:26:51.035849
# 2019-12-16 03:26:51.035849
# 2019-12-14 17:26:51.035849
# 2019-12-18 05:26:51.035849

可见,使用timedelta可以很容易地算出前几天和后几天的时刻。

2. calendar模块简介

  • calendar.monthrange(year,month)

返回两个整数。第一个是该月的星期几的日期码,第二个是该月的日期码。日从0(星期一)到6(星期日);月从1到12。

  • calendar.weekday(year,month,day)

返回给定日期的日期码。0(星期一)到6(星期日)。月份为 1(一月) 到 12(12月)。

print(calendar.weekday(year=2019, month=12, day=1))
# 6
print(calendar.monthrange(year=2019, month=12))
# (6, 31)

代码实现(Python)

1. 引入的模块

from datetime import datetime, timedelta
import calendar

2. 获取所有天,返回一个列表。

def getBetweenDay(begin_date, end_date):date_list = []begin_date = datetime.strptime(begin_date, "%Y%m%d")end_date = datetime.strptime(end_date, "%Y%m%d")while begin_date <= end_date:date_str = begin_date.strftime("%Y%m%d")date_list.append(date_str)begin_date += timedelta(days=1)return date_list

例子

date = getBetweenDay('20110201', '20110301')
print(date)# ['20110201', '20110202', '20110203', '20110204', '20110205', '20110206', '20110207', '20110208', '20110209', '20110210', '20110211', '20110212', '20110213', '20110214', '20110215', '20110216', '20110217', '20110218', '20110219', '20110220', '20110221', '20110222', '20110223', '20110224', '20110225', '20110226', '20110227', '20110228', '20110301']

3. 获取所有月,返回一个列表。

def add_months(dt, months):# 返回dt隔months个月后的日期,months相当于步长month = dt.month - 1 + monthsyear = dt.year + month // 12month = month % 12 + 1day = min(dt.day, calendar.monthrange(year, month)[1])return dt.replace(year=year, month=month, day=day)def getBetweenMonth(begin_date, end_date):date_list = []begin_date = datetime.strptime(begin_date, "%Y%m%d")end_date = datetime.strptime(end_date, "%Y%m%d")while begin_date <= end_date:date_str = begin_date.strftime("%Y%m")date_list.append(date_str)begin_date = add_months(begin_date, 1)return date_list

例子

month = getBetweenMonth('20111201', '20130201')
print(month)# ['201112', '201201', '201202', '201203', '201204', '201205', '201206', '201207', '201208', '201209', '201210', '201211', '201212', '201301', '201302']

4. 获取所有季度,返回一个字典。

def getBetweenQuarter(begin_date, end_date):# 加上每季度的起始日期、结束日期quarter_list = {}month_list = getBetweenMonth(begin_date, end_date)for value in month_list:year = value[:4]month = value[4:]if month in ['01', '02', '03']:quarter_list[year + "Q1"] = ['%s0101' % year, '%s0331' % year]elif month in ['04', '05', '06']:quarter_list[year + "Q2"] = ['%s0401' % year, '%s0630' % year]elif month in ['07', '08', '09']:quarter_list[year + "Q3"] = ['%s0731' % year, '%s0930' % year]elif month in ['10', '11', '12']:quarter_list[year + "Q4"] = ['%s1001' % year, '%s1231' % year]return quarter_list

例子

quarter = getBetweenQuarter('20111201', '20130201')
print(quarter)# {'2012Q1': ['20120101', '20120331'], '2012Q3': ['20120731', '20120930'], '2012Q4': ['20121001', '20121231'], '2012Q2': ['20120401', '20120630'], '2011Q4': ['20111001', '20111231'], '2013Q1': ['20130101', '20130331']}

代码实现(C#)

1. 获取所有天,返回一个列表。

static List<string> GetBetweenDay(DateTime begin, DateTime end)
{List<string> result = new List<string>();while (begin <= end){string year = begin.Year.ToString();string month = begin.Month.ToString().PadLeft(2, '0');string day = begin.Day.ToString().PadLeft(2, '0');result.Add(string.Concat(year,month,day));begin = begin.AddDays(1);}return result;
}

2. 获取所有月,返回一个列表。

static List<string> GetBetweenMonth(DateTime begin, DateTime end)
{List<string> result = new List<string>();begin = new DateTime(begin.Year, begin.Month, 1);while (begin <= end){string year = begin.Year.ToString();string month = begin.Month.ToString().PadLeft(2, '0');result.Add(string.Concat(year, month));begin = begin.AddMonths(1);}return result;
}

3. 获取所有季度,返回一个字典。

static Dictionary<string, string> getBetweenQuarter(DateTime begin, DateTime end)
{Dictionary<string, string> result = new Dictionary<string, string>();List<string> lst = GetBetweenMonth(begin, end);foreach (string str in lst){string year = str.Substring(0, 4);string month = str.Substring(4, 2);switch (month){case "01":case "02":case "03":if (result.Keys.Contains(year + "Q1") == false){result.Add(year + "Q1", year + "0101," + year + "0331");}break;case "04":case "05":case "06":if (result.Keys.Contains(year + "Q2") == false){result.Add(year + "Q2", year + "0401," + year + "0630");}break;case "07":case "08":case "09":if (result.Keys.Contains(year + "Q3") == false){result.Add(year + "Q3", year + "0701," + year + "1031");}break;case "10":case "11":case "12":if (result.Keys.Contains(year + "Q4") == false){result.Add(year + "Q4", year + "1101," + year + "1231");}break;}}return result;
}

总结

本篇图文介绍了如何利用 Python 和 C# 语言来构建一个区间段日期的方法,为后面爬取气象数据做准备。大家如果感兴趣可以试验一下啊。今天就这样吧!See You!


参考文献

  • https://blog.csdn.net/joson1234567890/article/details/80946974
  • https://www.liaoxuefeng.com/wiki/1016959663602400/1017648783851616
  • http://www.imooc.com/wiki/detail/id/1911

往期活动

LSGO软件技术团队会定期开展提升编程技能的刻意练习活动,希望大家能够参与进来一起刻意练习,一起学习进步!

  • Python基础刻意练习活动即将开启,你参加吗?
  • Task01:变量、运算符与数据类型
  • Task02:条件与循环
  • Task03:列表与元组
  • Task04:字符串与序列
  • Task05:函数与Lambda表达式
  • Task06:字典与集合
  • Task07:文件与文件系统
  • Task08:异常处理
  • Task09:else 与 with 语句(1day)
  • Task10:类与对象
  • Task11:魔法方法
  • Task12:模块

相关文章:

C#按关闭按钮实现最小化,按ESC才关闭的实现【含系统消息大全】

protected override void WndProc(ref Message m) { const int WM_SYSCOMMAND 0x0112; const int SC_CLOSE 0xF060; if (m.Msg WM_SYSCOMMAND && (int)m.WParam SC_CLOSE) { // 屏蔽传入的消息事件 …

眠眠interview Question

1. Wkwebkit在异步回调 如何像webview的回调 一样在主线程回调。可以使用runloop 解决么&#xff1f; dispatch get main queue http://www.jianshu.com/p/a2fc399075e0 转载于:https://www.cnblogs.com/tufei7/p/7657617.html

哪些人适合参加软件测试培训

软件测试是现在很多企业需求都非常大的一个岗位&#xff0c;只要是互联网行业基本都是有需求的&#xff0c;那么想要学习软件测试&#xff0c;哪些人适合参加软件测试培训呢?来看看下面的详细介绍。 哪些人适合参加软件测试培训? 想从零开始进入软件技术行业 软件测试的优势是…

从iso镜像升级ubuntu

步骤&#xff1a; 1.从网上下载Alternate版本的ISO镜像 2.加载ubuntu镜像 # mount -t iso9660 -o loop ubuntu-11.10-alternate-i386.iso /mnt/cdrom/3.进入/mnt/cdrom/ 运行cdromupgrade 程序 # cd /mnt/cdrom/ # ./cdromupgrade转载于:https://www.cnblogs.com/dudp/archive…

技术图文:如何爬取一个地区的气象数据(下)?

背景 架空线路常见的故障有&#xff1a;风偏闪络故障、雷击跳闸故障、雷击断股故障、线路覆冰故障、线路污闪故障、线路外力破坏故障、线路鸟害故障等等。从这些故障中&#xff0c;我们可以看出天气对线路的安全运行起到非常重要的作用。 在上一篇图文 如何爬取一个地区的气象…

Android :landscape||portrait 切换

可在AndroidManifest.xml里面配置屏幕发现。 在<Activity>中加入这一行android:screenOrientation"landscape/portrait " android中每次屏幕的切换动会重启Activity&#xff08;可以在Activity销毁前保存当前活动的状态&#xff0c;在Activity再次Create的时候…

web前端开发培训完就业前景怎么样

很多人都在学习web前端技术&#xff0c;认为学好这一项编程技术&#xff0c;找工作是非常稳定的&#xff0c;那么到底web前端开发培训完就业前景怎么样呢?来看看下面的详细介绍就知道了。 web前端开发培训完就业前景怎么样? web前端薪资待遇 从图中我们能够看到web前端从业者…

技术图文:如何改进算法的运行效率?

背景 前段时间&#xff0c;一位好友发给我如下的文件&#xff1a; 每个CSV文件中的数据由三个属性组成&#xff0c;第一个属性为ID&#xff0c;第二个属性为X坐标&#xff0c;第三个属性为Y坐标。由于是二维数据&#xff0c;可以绘制出每个文件的散点图&#xff0c;把这些散点…

B树,B+树,B-树和B*树

B树 即二叉搜索树&#xff1a; 1.所有非叶子结点至多拥有两个儿子&#xff08;Left和Right&#xff09;&#xff1b; 2.所有结点存储一个关键字&#xff1b; 3.非叶子结点的左指针指向小于其关键字的子树&#xff0c;右指针指向大于其关键字的子树&#xff1b; 如&#xff1a; …

JS对象直接量,数组直接量和函数直接量

对象直接量创建一个对象&#xff1a; var obj {x:[1,2],y:23}; 代码跟下面是一样的。 var objnew Object(); obj.xnew Array(1,2); obj.y23; 测试&#xff1a;for(var i in obj) alert(obj[i]); 函数直接量&#xff1a;它是一个表达式而不是语句。 (function(){})() 如下例&am…

学习Java编程培训的书籍有哪些

学习java技术除了线上线下的培训学习&#xff0c;书籍的知识也是非常重要的&#xff0c;今天小编为大家整理的就是学习Java的一些书籍&#xff0c;Java书籍是程序员学习提升技能的重要学习渠道&#xff0c;通过书籍Java程序员可以学习当前流行、重要的相关技能。下面我们一起来…

Datawhale组队学习:数据结构与算法课程任务

背景 Datawhale 是国内很有名的一个开源学习组织。这个组织将渴望改变的学习者以及一群有能力有想法的青年人集结在一起&#xff0c;营造出一种互促高效的学习环境&#xff0c;一起为开源学习付出努力。 Datawhale 近期将推出三门课程的组队学习。我先将 数据结构与算法&…

live555学习笔记2-基础类

二 基础类 讲几个重要的基础类&#xff1a; BasicUsageEnvironment和UsageEnvironment中的类都是用于整个系统的基础功能类&#xff0e;比如UsageEnvironment代表了整个系统运行的环境&#xff0c;它提供了错误记录和错误报告的功能&#xff0c;无论哪一个类要输出错误&#x…

自己写的小工具集合

2019独角兽企业重金招聘Python工程师标准>>> 文件夹大小查看工具 用于查看文件夹下每个子文件和子文件夹的大小.以前想统计文件夹大小,只能点右键看属性,而且只能看到文总大小。这个小工具可以通过右键启动,而且能查看文件夹下所有文件和文件夹的大小. 以前用过类似…

哪些人适合学软件测试呢

软件测试是现在很多企业的一个刚需岗位&#xff0c;所以软件测试的发展前景是非常好的&#xff0c;想要了解哪些人适合学软件测试呢?来看看下面的详细介绍就知道了。 哪些人适合学软件测试呢? 1.无编程基础 测试的代码量仅为20%左右&#xff0c;无论是文科生还是非计算机专业…

javabean和EJB的区别

Java Bean 是可复用的组件&#xff0c;对Java Bean并没有严格的规范&#xff0c;理论上讲&#xff0c;任何一个Java类都可以是一个Bean。但通常情况下&#xff0c;由于Java Bean是被容器所创建(如Tomcat)的&#xff0c;所以Java Bean应具有一个无参的构造器&#xff0c;另外&am…

Datawhale组队学习:初级算法梳理课程任务

背景 Datawhale 是国内很有名的一个开源学习组织。这个组织将渴望改变的学习者以及一群有能力有想法的青年人集结在一起&#xff0c;营造出一种互促高效的学习环境&#xff0c;一起为开源学习付出努力。 Datawhale 近期将推出三门课程的组队学习。我先将 初级算法梳理 的任务…

CSS将长文字换行的方法 (转)

大家都知道连续的英文或数字能是容器被撑大&#xff0c;不能根据容器的大小自动换行&#xff0c;下面是 CSS如何将他们换行的方法&#xff01; 对于div 1.&#xff08;IE浏览器&#xff09;white-space:normal; word-break:break-all;这里前者是遵循标准。 #wrap{white-space:n…

学Java的软件哪些比较好用

很多java程序猿在工作的时候都会用一些辅助工具&#xff0c;辅助工具可以很好的帮助程序猿高效率的完成工作&#xff0c;那么具体学Java的软件哪些比较好用呢?来看看下面的详细介绍。 学Java的软件哪些比较好用? 1. Eclipse Eclipse做为一款开发源代码的Java扩展性开发平台&a…

DataTable的Compute功能详解

在为筛选器创建表达式时&#xff0c;用单引号将字符串括起来&#xff1a;"LastName Jones"下面的字符是特殊字符&#xff0c;如下面所解释的&#xff0c;如果它们用于列名称中&#xff0c;就必须进行转义&#xff1a;\n (newline)\t (tab)\r (carriage return)~()#\…

Datawhale第九期组队学习计划

Datawhale 组队学习 第九期Datawhale组队学习计划马上就要开始啦&#xff01; 这次共组织三个组队学习&#xff0c;涵盖了编程、机器学习理论以及动手实践的内容&#xff0c;大家可以按照需要选择参加。 数据结构与算法&#xff08;上&#xff09; 内容设计&#xff1a;光城…

Hibernate获取数据java.lang.StackOverflowError

原因&#xff1a;因为在重写toString()方法时&#xff0c;把关联的属性也放入到toString方法中了&#xff0c;去掉就可以了。 如&#xff1a;重写的toString方法中不能有关联关系IDCard属性idCard public class Person {private Integer id;private String name;private IDCard…

UI设计培训之UI设计系统知识

最近有很多小伙伴都在学习UI设计的相关知识&#xff0c;很多同学都是东边一学习一下&#xff0c;西边学习一下&#xff0c;根本没有明确的学习方法&#xff0c;对于这个问题小编为大家整理了一下学习UI设计的系统知识&#xff0c;一起看看吧! UI设计培训之UI设计系统知识&#…

java 中的 Enumeration 在Vector,Hashtable和web中的应用

public interface Enumeration<E> 实现 Enumeration 接口的对象&#xff0c;它生成一系列元素&#xff0c;一次生成一个。连续调用 nextElement方法将返回一系列的连续元素。 例如&#xff0c;要输出 Vector<E> v的所有元素&#xff0c;可使用以下方法&#xff1a;…

Datawhale组队学习 Task01:数组(1天)

Task01&#xff1a;数组&#xff08;1天&#xff09; 1. 数组的定义 数组是具有一定顺序关系的若干对象组成的集合&#xff0c;组成数组的对象称为数组元素。 例如&#xff1a; 向量对应一维数组矩阵对应二维数组 数组名表示群体的共性&#xff0c;即具有同一种数据类型&a…

IOS一些显示效果和动画效果资料

2019独角兽企业重金招聘Python工程师标准>>> 1.基于AutoLayout的UIScrollView悬停Tab 转载于:https://my.oschina.net/zhugenqiang/blog/1551389

零基础小白学Java难度大不大

零基础小白学Java难度大不大?有很多人都是非常关心这个问题的&#xff0c;如今java在IT互联网行业的快速发展&#xff0c;引起了很多人的注意&#xff0c;那么&#xff0c;哪些人适合入行Java?零基础学习Java难度大吗?下面&#xff0c;小编就为大家解答这些问题。 零基础小白…

Datawhale组队学习 Task02:顺序表和链表(2天)

Task02 顺序表和链表&#xff08;2天&#xff09; 1. 线性表的定义与操作 1.1 线性表的定义 线性表&#xff08;Linear List&#xff09;是由n&#xff08;n > 0&#xff09;个相同类型的数据元素a1,a2,...,an 组成的有序序列。即表中除首尾元素外&#xff0c;其它元素有…

腾讯联姻开心网意欲何为

今天杨长升在新浪科技上看到这样一条信息“腾讯日前已收购开心网部分股份&#xff0c;有意成为开心网大股东。”据了解&#xff0c;早在8月就曾有消息称&#xff0c;腾讯已收购开心网部分股份&#xff0c;现有一位投资界人士处证实了最新的消息&#xff1a;“腾讯参股开心网确有…

在Excel单元格中使用下拉框

文章出处: http://www.cnblogs.com/huangcong/archive/2010/05/21/1740539.html 有时候我们只希望在Excel中的某个单元格中只允许输入某几个限定的数据,这时候我们就可能希望把该单元格设置成为下拉框的形式了,如下图所示: 下面就看看是怎么实现的吧. 1.我们选择一个单元格--数…