用Python进行时间处理合集
一、Time
平常的工作与学习中,会遇到许许多多与时间相关的问题,例如时间戳,时间格式化等等。所以今天就带大家了解一下python中处理时间的模块,time,更多的是希望大家不在坑里反复循环的进去出来,相信大家都比我聪明 -_ -…
1.1.获取当前时间
1.2.将时间戳转化为时间元组
首先,获取当前时间(以下代码默认导入time模块,不再重复)
import time
time.time()
#获取当前时间戳:1542610928.524562
time.localtime(time.time())
#获取当前时间:将时间戳转换为时间元组
#time.struct_time(tm_year=2018, tm_mon=11, tm_mday=19, tm_hour=15, tm_min=2, tm_sec=8, tm_wday=0, tm_yday=323, tm_isdst=0)
1.3.struct_time(时间元组)中各部分的含义
属性 | 值 |
---|---|
tm_year | 2020 |
tm_mon | 3(1到12) |
tm_mday | 26(1到31) |
tm_hour | 11(0到23) |
tm_min | 36(0到59) |
tm_sec | 8(0到61,60 或61是闰秒) |
tm_wday | 3(0到6,0是周一) |
tm_yday | 82(1到366(儒略历)) |
tm_isdst | 0(-1,0,1,-1是决定是否为夏令时的旗帜) |
1.4.获取格式化时间
asctime方法:直接获取可读的时间格式
time.asctime( time.localtime(time.time()))
#'Thu Mar 26 11:39:12 2020'
strftime方法:获取自定义格式的时间,获取对象为时间元组
time.strftime("%a %b %d %H:%M:%S %Y", time.localtime())
#'Thu Mar 26 11:40:00 2020'
time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
#'2020-03-26 11:40:10'
1.5.时间日期格式化符号
%y 两位数的年份表示(00-99) | %Y 四位数的年份表示(000-9999) |
%m 月份(01-12) | %d 月内中的一天(0-31) |
%H 24小时制小时数(0-23) | % I 12小时制小时数(01-12) |
%M 分钟数(00=59) | %S 秒(00-59) |
%a 本地简化星期名称 | %A 本地完整星期名称 |
%b 本地简化的月份名称 | %B 本地完整的月份名称 |
%c 本地相应的日期表示和时间表示 | % j 年内的一天(001-366) |
%p 本地A.M.或P.M.的等价符 | %U 一年中的星期数(00-53)星期天为星期的开始 |
%w 星期(0-6),星期天为星期的开始 | %W 一年中的星期数(00-53)星期一为星期的开始 |
%x 本地相应的日期表示 | %X 本地相应的时间表示 |
%Z 当前时区的名称 | %% %号本身 |
1.6.将格式字符串转换为时间戳
将格式字符串转换为时间戳:(上面通过time.localtime将时间戳转换为时间元组,这里是逆过程)
time.mktime(time.strptime())
其中strptime()根据字符串对应的时间格式把一个时间字符串解析为时间元组。
a ='Mon Nov 19 15:21:20 2018'
time.mktime(time.strptime(a,"%a %b %d %H:%M:%S %Y"))
#时间戳为:1542612080.0
1.7.Time模块的其他重要函数:
time.sleep(),time.timezone
time.sleep(secs)
#推迟调用程序的运行,secs指秒数。
time.timezone
#显示当地时区(未启动夏令时)距离格林威治的偏移秒数(>0,美洲;<=0大部分欧洲,亚洲,非洲)。
内容不多,目的是想让大家明确如何将时间与时间戳来回转换,并且中间需要时间元组进行过渡,明白了这一点就ok了。
二、Datetime
接下来看下Datetime模块,这里主要想解决的问题是如何计算两个时间的差,并且返回秒,分钟,小时,所以内容主要更偏向于解决问题,如果大家没有看到自己需要的,最后会放上官方文档供大家参考。
首先看一下它具有的类及描述:
类名 | 描述 |
---|---|
datetime.date | 日期对象,属性:year,month,和 day 。 |
datetime.time | 时间对象,属性:hour,minute,second,microsecond 和 tzinfo。 |
datetime.datetime | 日期和时间的组合对象,属性:year,month,day,hour,minute,second,microsecond 和 tzinfo。 |
datetime.timedelta | 两个日期或时间之间的差。 |
datetime.tzinfo | 表示 UTC 时区的固定偏移,是 tzinfo 基类的实现 |
datetime.timezone | 将 tzinfo 抽象基类实现为与UTC的固定偏移量的类。 |
这里需要注意的是datetime默认的两个常量分别是MINYEAR和MAXYEAR,即最小年与最大年分别是1和9999
datetime.MINYEAR
#1
datetime.MAXYEAR
#9999
为大家科普一下常用的方法:
datetime.date.today()
返回当前时间,只会返回年月日。
datetime.date.fromtimestamp(timestamp)
返回时间戳所对应的时间,只会返回年月日。
datetime.datetime.now()
返回当前时间,返回值为年月日,小时,分钟,秒,毫秒。
datetime.datetime.strptime(‘2018-11-20 15:51:24.482422’,"%Y-%m-%d %H:%M:%S.%f")
按字符串的格式返回datetime.datetime数据。
datetime.datetime.fromtimestamp(1542696019.5583735)
返回时间戳所对应的时间,包含年月日,小时,分钟,秒,微秒。
datetime.datetime.timestamp(datetime.datetime())
返回时间戳,输入的是datetime.datetime类型数据。
datetime.date.today()
#datetime.date(2018, 11, 20)
datetime.date.fromtimestamp(1542696019.5583735)
#datetime.date(2018, 11, 20)
datetime.datetime.now()
#datetime.datetime(2018, 11, 20, 16, 4, 41, 186189)
datetime.datetime.strptime('2018-11-20 15:51:24.482422',"%Y-%m-%d %H:%M:%S.%f")
#datetime.datetime(2018, 11, 20, 15, 51, 24, 482422)
datetime.datetime.fromtimestamp(1542696019.5583735)
#datetime.datetime(2018, 11, 20, 14, 40, 19, 558373)
datetime.datetime.timestamp(datetime.datetime(2018, 11, 20, 14, 40, 19, 558373))
#1542696019.558373
这里提示大家一下,datetime.date.today()和datetime.datetime.now()返回的值是datetime.datetime格式,可以直接用str(datetime.datetime.now())的方法将数据转换为字符串,方便进行存储。例如str(a),返回的结果是个字符串。
接下来进入正题:
<mark>首先创建两个时间:</mark>
a = datetime.datetime.now()
b = datetime.datetime.now()
#注意这两个时间是在不同时间创建的,所以值不相同。
<mark>将这两个时间相减可得:</mark>
c = b-a
c
#datetime.timedelta(0, 283, 433989)
#上面是两个时间相减产生的结果,返回的参数分别为天,秒,微秒
type(c)
#datetime.timedelta
<mark>依次调用 datetime.timedelta 的属性:</mark>
c.days
#0
#天数
c.seconds
#283
#秒数
c.total_seconds()
#283.433989
#秒数加微秒的值
结果就如上所示了,其实关键点就是要先将时间转换成 datetime.datetime 形式,然后就可以直接做运算。
三、pandas.to_datetime
pandas.to_datetime(),它是pandas库的一个方法,pandas库想必大家非常熟悉了,这里不再多说。这个方法的实用性在于,当需要批量处理时间数据时,无疑是最好用的。
首先看一下它的主要几个参数
pandas.to_datetime(arg,errors ='raise',utc = None,format = None,unit = None )
参数 | 意义 |
---|---|
errors | 三种取值,‘ignore’, ‘raise’, ‘coerce’,默认为raise。‘raise’,则无效的解析将引发异常。‘coerce’,那么无效解析将被设置为NaT。‘ignore’,那么无效的解析将返回输入值 |
utc | 布尔值,默认为none。返回utc即协调世界时。 |
format | 格式化显示时间的格式。 |
unit | 默认值为‘ns’,则将会精确到微妙,‘s’为秒。 |
例子
官方文档中有几个简单的例子,这里稍微提一下:
1、
df = pd.DataFrame({
'year': [2015, 2016],
'month': [2, 3],
'day': [4, 5]})
pd.to_datetime(df)
#0 2015-02-04
#1 2016-03-05
#dtype: datetime64[ns]
#可以看到将字典形式时间转换为可读时间
2、
pd.to_datetime('13000101', format='%Y%m%d', errors='ignore')
#datetime.datetime(1300, 1, 1, 0, 0)
pd.to_datetime('13000101', format='%Y%m%d', errors='coerce')
#NaT
#如果日期不符合时间戳限制,则errors ='ignore'将返回原始输入,而不会报错。
#errors='coerce'将强制超出NaT的日期,返回NaT。
然而实际中遇到的可能是这样的数据:
通过pandas.read_csv()或者pandas.read_excel()读取文件过后,得到的数据列对应的类型是“object”,这样没法对时间数据处理,可以用过pd.to_datetime将该列数据转换为时间类型,即datetime。
data.dtypes
# object
data= pd.to_datetime(data)
data.dtypes
# datetime64[ns]
转换过后就可以对这些时间数据操作了,可以相减求时间差,计算相差的秒数和天数,调用的方法和datetime库的方法一致,分别是 data.dt.days() 、data.dt.seconds() 、data.dt.total_seconds()。
到这里就结束了吗? 不不,还没有。这里再教大家通过pandas将时间与时间戳相互转换,原理是一样的通过datetime、time库,技巧是用apply()函数来实现它。
将data的所有时间转换为时间戳(此时数据类型已经是datetime,是object的报错不要找我。。)
data = data.apply(lambda x:time.mktime(x.timetuple()))
#x.timetuple()将时间转换为时间元组,提前导入time模块
将data的所有时间戳转换为可读时间:
data = data.apply(lambda x:time.strftime('%Y/%m/%d %H:%M:%S',time.localtime(x)))
#代码含义为:先读取时间戳数据,将其转换为时间元组,在通过格式化时间转换为可读的时间格式
结束了结束了。。
errors ='ignore’是什么意思
pd.to_datetime(‘13000101’, format=’%Y%m%d’, errors=‘coerce’)
#NaT
#如果日期不符合时间戳限制,则errors ='ignore’将返回原始输入,而不会报错。
#errors='coerce’将强制超出NaT的日期,返回NaT。