
终于迎来了周末,能让我有时间把这周立的flag全部解决掉。
在上一篇pandas练习中,我有提到要把python的时间处理单独写一篇,如果有读者仔细观察的话,可以看到我用的图片就是时间模块datetime里面的一些操作。那么我们今天的要学习的内容就是datetime内建模块和pandas库中处理时间的几个函数,以及resample, re-sample是重新采集的意思,也可以理解为把时间按照一定的约定重置。
刚好最近做的pandas练习系列里面刚好有一个章节是时间序列的练习的。
所以学完基础的知识以后加上一个练习,我相信可以对这个部分能有不同的理解。
好的,让我开始快乐的时间之旅吧。
首先申明我学习这种库喜欢直接去啃官方的文档,来源在这
datetime - Basic date and time types - Python 3.7.4rc1 documentationdocs.python.org以及
pandas.to_datetime - pandas 0.24.2 documentationpandas.pydata.org还有
Resampling - pandas 0.24.2 documentationpandas.pydata.org有兴趣的伙伴也可以自己去这几个网址学习。
在今天回顾之前写的文章的过程中,我发现自己有一个很大的缺点,那就是缺乏逻辑性,之前的文多有一种随性所为的意思,所以我想从这篇文章开始,引入思维导图,这一方面方便各位读者,另一方面当我自己回头看自己的写过的文的时候,也能更加的方便的常读常新。
一、python有很多库可以用来处理时间,如:datetime,time,calendar等

而datetime常用的是datetime.datetime函数。我们今天就从datetime来入手了
学习任何一个模块的时候都应该先看这个库都有哪些模块
同样的使用导图

开始这个库之前,我们要首先看两个参数
datetime.MINYEAR=1
datetime.MAXYEAR=9999
这两个类表示的是datetime从1到9999,这对于我们的处理来说足够了,毕竟看到这篇文章的没有人可以到9999年。LOL
通过上面的图形,能够清楚的看到,datetime库最常用的是timedelta和datetime这两个类。
我们首先看一下timedelta
from datetime import datetime
now = datetime.now()
now
求解一个时间差
delta = datetime(2000,1,7) - datetime(1998,6,23,7,16)
delta
delta.days
delta.seconds
这两个语句就是表示的两个时间的差值,其中delta.days表示的是两个时间之间相差的天数,delta.seconds表示的是相差的秒钟数。也就是我输入的这两个时间相差562天,60240微秒
我们再来看一下timedelta的一些基本操作
from datetime import timedelta
year = timedelta(days=365)
another_year = timedelta(weeks=40,days=84,hours=23,
minutes=50,seconds=600)
year.total_seconds()
year == another_year
时间的相加
start 
时间相减
start 
好的,下面主要来看一下datetime.datetime,我们之所以学习datetime库是因为在实际的工作中,时间格式不是统一的,不同的人会有不同的写法。使用datetime可以按照我们想要的时间格式来实现
datetime.today()
获取当前的时间
datetime.now()
获取伦敦的当前时间,因为,我们知道我们是东8区,所以应该相差8个小时
datetime.utcnow()
可以看到确实是相差了8个小时。
下面看一个比较常用的字符串型时间转换为常见的日期格式的操作。
有两种操作
1 strftime(format)
2datetime.strptime(string,format)现在分别介绍一些这两个用法
stamp 
我们在来看一下第二中操作时间的做法
dt = datetime.strptime('21/11/06 16:30','%d/%m/%y %H:%M')
dt
能够看到这两个的做法的区别是什么,1第一种做法是直接操作一个字符串的,而第二种的做法是把字符串传递给模块,然后根据格式操作。
但是以上的两种做法都有一个问题,就是每次使用时都要编写一个格式,这个就很方便了,所以这里介绍一个第三方包dateutil 这个库中有一个类parser 这个类种有一种做法是parser.parse
我们来看一下
from dateutil.parser import parse
parse('2001-01-03')
再看一个例子,
parse('20140608')
可以看到这个处理时间非常方便,可以直接把类似于时间的格式,直接处理成数据的形式,简单方便。
基本所有的日期表示dateutil都能够解析,比如下面这个
parse('Jan 31,1997 10:45 PM')
在国际上经常能够看到日期出现在月份之前,可以传递dayfirst = True来表明这种情况
如下所示
parse('6/12/2011',dayfirst=True)
以上是介绍了datetime以及一个非常好用的库dateutil,但是要注意的是,dateutil是一个好用但是不完美的工具,比如可能将一些字符串识别为不想要的日期
parse
可以看到,把42这种无法直接识别的字符串识别成了2042年的当天(上面是一个很好的例子)当然了,其实也可以理解,对于时间来说,最好的当然还是有年月日了,所以这个库还是很还用的。
各位关注我的朋友应该知道,我最近一直在写一个系列,那就是pandas练习,了解一点pandas的应该都知道,pandas真的超级好用,不仅可以处理不同格式的数据,还可以画图,有一位朋友给我留言说为什么不用pandas直接绘图,其实我知道pandas能够绘制图,但是这通常需要和matplotlib一起用。所以我就没用panda绘图。
好吧扯得有点远,下面我们来看一下pandas处理时间时的一些应用,这个主要包含todatetime,resample,还有用来处理时间索引的data_range
下面我将重点说明这三个部分。
首先我们来看一下pandas.to_datetime,这个模块可以很好的转换很多不同的日期表示格式。
老规矩,还是先看一下这个模块的参数
pandas我专门做了一个表格来说明这些参数分别代表着什么以及怎么使用

下面我们看一些例子,来加深理解
df = pd.DataFrame({'year':[2015,2016],
'month':[4,3],
'day':[4,5]})
pd.to_datetime(df)
这个例子中转换的数据是DataFrame
dt = '2016-07-08'
pd.to_datetime(dt)
这个例子使用的是字符串型
下面我们做一个整型数据的转换
dt1 = 20190807
pd.to_datetime(dt1,unit='s')
我们在看一下errors的用法
#把dt1转换成想要的时间格式
pd.to_datetime(dt1,format='%Y%m%d',errors='ignore')
再来一个
pd.to_datetime('13000101',format='%Y%m%d',errors='coerce')
NaT=Not a Time是时间里面的空值
我们再来看一下infer_datetime_format等于True时的执行顺序,
#首先创建一个数据
s = pd.Series(['3/11/2000','3/12/2000','3/13/2000']*1000)
s.head()
在看一下执行用时,这里要使用魔法函数,以及即时函数timeit
%timeit pd.to_datetime(s,infer_datetime_format=True)
%timeit pd.to_datetime(s,infer_datetime_format=False)
能够看到着两个语句执行速度的区别,infer_datetime_format=True的执行速度是infer_datetime_format=False的20多倍
好的到这里to_datetime这个模块基本到位了,这个可以和to-numeric模块联系起来,很方便,很强大,能够处理的数据类型很多
由于最后一部分resample的内容特别多,所以我想了想还是分两部分来写吧。
好的今天就到这里了,我们下期节目再见!
哈哈哈,期待朋友们的点赞!谢谢!!!
本文介绍了Python中datetime模块的使用,包括timedelta和datetime类,展示了如何进行时间差计算和时间格式转换。此外,文章提到了dateutil库的parser.parse方法,提供了一种更便捷的字符串转日期方式。最后,简述了pandas的to_datetime函数及其参数,并指出其在处理日期转换时的高效性。
1942

被折叠的 条评论
为什么被折叠?



