不论是数据分析还是其它方面,对于时间格式的处理司空见惯,尤其是金融、气象、调查等方面,时间的应用是无处不在的。
利用python来处理时间是十分方便的一种方式。
python的datetime、dateutil模块和pandas的to_datetime都能够对时间进行很好的处理。各自也有各自的方法。
对于时间的处理大多数都是:
时间格式->str 、 str->时间格式
python或利用pandas在读取某列数据时,除非能明确确定数据的类型,否则它都会按照最安全的方式来读取。一旦有非法数据或异常数据,它都会改变数据类型。
例子:
from datetime import datetime
now = datetime.now()
print('年:{},月:{},日:{}'.format(now.year,now.month,now.day))
年:2018,月:4,日:25
diff = datetime(2017,3,4,17) - datetime(2017,2,18,15)
print(type(diff))
print(diff)
print('历经了{}天,{}秒'.format(diff.days,diff.seconds)) #两个都是总计时
#时间格式类型
14 days, 2:00:00
历经了14天,7200秒
字符串和datetime的转换:str()
dt_obj = datetime(2017,3,4)
str_obj = str(dt_obj) #python惯用的强制转换方法
print(type(str_obj))
print(str_obj)
2017-03-04 00:00:00
datetime.strftime() #str format time
str_obj2 = dt_obj.strftime('%d-%m-%Y') #%Y/%m%d 中间的连接符随便换
print(str_obj2)
04-03-2017
strptime #str parse time
dt_str = '2017-02-18' #str p time p:parse
dt_obj2 = datetime.strptime(dt_str,'%Y-%m-%d') #解析时连接符不能改变
print(type(dt_obj2))
print(dt_obj2)
2017-02-18 00:00:00
dateutil.parser.parse #相对于上面连接符和指定格式,这个方法-/都行,也不用指定格式
from dateutil.parser import parse
dt_str2 = '2017/02/18' #02-18-2017 也行的 很强大
dt_obj3 = parse(dt_str2)
print(type(dt_obj3))
print(dt_obj3)
2017-02-18 00:00:00
pd.to_datetime
import pandas as pd
s_obj = pd.Series(['2017/02/18','2017/02/19','2017-02-25','2017-02-26'],name='course_time')
print(s_obj)
0 2017/02/18
1 2017/02/19
2 2017-02-25
3 2017-02-26
Name: course_time, dtype: object
s_obj2 = pd.to_datetime(s_obj) #可以处理其中空字符串
print(s_obj2)
0 2017-02-18
1 2017-02-19
2 2017-02-25
3 2017-02-26
Name: course_time, dtype: datetime64[ns]
处理缺失值
s_obj3 = pd.Series(['2017/02/18','2017/02/19','2017-02-25','2017-02-26']+[None],name='course_time')
print(s_obj3)
s_obj4 = pd.to_datetime(s_obj3)
print(s_obj4)
0 2017/02/18
1 2017/02/19
2 2017-02-25
3 2017-02-26
4 None
Name: course_time, dtype: object
0 2017-02-18
1 2017-02-19
2 2017-02-25
3 2017-02-26
4 NaT
Name: course_time, dtype: datetime64[ns] #可以看到两次的格式改变了
提醒一下:时间空值输出为NaT 数值为NaN
总结一下:在str转时间格式或是时间格式转str时,有很多种方法,一定要合理的使用,不要搞混了,使用起来也很方便。dateutil模块很强大,它几乎包括了所有常用的时间格式。掌握它很有必要。