背景
有时,我们需要对日期和时间进行简单的运算。
例如:
一: 求日期差距
上面这组数据中,有两组日期,我们可以直接求出他们之间的间隔。
简单的相减就能得出两个日期之间的日期差。
但是很奇怪,为什么得出的结果里面有days这个单位呢?得出的数据是什么属性呢?
原来得出的并不是整数型也不是个字符串,而是datetime库里常用的timedelta型。
怎样把这些数据转换成整数,方便我们后续使用呢?
对每一个元素使用一次.days就能将数据转换为整数。
timedelta型数据,不能直接转换成年、周、月等,只能转换为天数、秒数和微秒数。而且在返回秒数和微秒数时,如果是负数时,容易出错(例如:-3秒会被处理为-1天86397秒)
所以在转换间隔秒数时最好使用total_seconds()
二 计算几天之后的日期
如果我想知道,n天前或者n天后的日期,可以直接加减么?
很抱歉,不可以。。。。。。
这个功能要使用datetime库里面的timedelta函数。
减法也可以:
不仅仅是加减天数,也可以加减小时:
加减星期数:
除了加减天数、小时数、星期数,还可以加减分钟minutes, 秒seconds,毫秒和微秒。不能直接加减月数,年数。毕竟每年和每个月的天数是不一样的。
三、整列都去计算和另一个日期的差距
如果需要对所有整列都减去同一个日期,我们需要定义一个日期,让系统识别得出来。
这样日期和日期之间就能运算了:
总的来说:pandas里面的日期运算并不是特别方便,需要借助datetime库,而且timedelta数据类型转换成整数时并不容易。
四、 引入pandas中的dt概念
自然是有的就是.dt。跟.str一样,后面可以加多个函数进行操作。
这里的dt自然代表的是datetime(我猜)。
比如现在有一组数据:
由于日期这一列是datetime64格式,当导出到excel或者别的地方的时候,就会出现格式不是我们想要的。
这种在导出后还要再次调试格式,让我的懒病都发作了。
五、 日期设置格式:dt.strftime()
注意:经过.dt.strftime()处理后的数据就不再是datetime类型,就算导出到excel也是不能直接被识别为日期的,所以处理时要慎重。
当然,还可以处理成其它格式:
还有设置格式更简洁的方式:
dt.date只提取日期部分
只要记住大写Y和小写y的区别,其它的就可以随心所欲了。dt.strftime()与Datetime库里面的格式设置是不一样的,请注意区别。
六、 提取时间日期中的 部分信息:
dt.year能直接提取出年份,而且是整数型。
其它信息和年份差不多:
月份
日
小时
时间
季度
还可以返回星期几:(星期一是0,星期天是6,跟切片的时候很相似。)
七、 timedelta上面使用dt函数
这就联想到上一篇文章提到的timedelta类型提取日期,那这个dt能不能用在timedelta类型的数据上呢?
实现了,而且更方便了,这里的.days很类似datetime库里面的.days。相当于用.dt.days代替了之前的map(lambda x:x.days)。
按照这个逻辑,.dt.total_seconds()也是可以使用的。
的确可行。
八、计算天数相关:
这个可以计算日期位于某一年的第几天(正常计数):
下面这个可以计算这些日期位于一年第几周:
除了上面这些,还有.dt后面还可以接很多函数,实在太多,就不一一介绍了。