Python中的时间模块
1 time模块
时间相关的操作,时间有三种表示方式:
- 时间戳 1970年1月1日00:00:00开始按秒计算的偏移量,即:time.time()
- 格式化的字符串 2014-11-11 11:11, 即:time.strftime(‘%Y-%m-%d’)
- 结构化时间 元组包含了:年、日、星期等… time.struct_time 如:time.localtime()
import time
1.1 时间戳
# 返回当前时间的时间戳
time.time()
1533547964.642454
1.2 结构化时间 time.struct_time
# localtime([secs])
# 将一个时间戳转换为当前时区的struct_time。secs参数未提供,则以当前时间为准。
time.localtime()
time.struct_time(tm_year=2018, tm_mon=8, tm_mday=6, tm_hour=17, tm_min=33, tm_sec=18, tm_wday=0, tm_yday=218, tm_isdst=0)
time.localtime(1533547964.642454)
time.struct_time(tm_year=2018, tm_mon=8, tm_mday=6, tm_hour=17, tm_min=32, tm_sec=44, tm_wday=0, tm_yday=218, tm_isdst=0)
t=time.localtime()
t.tm_year
2018
# gmtime([secs])
# 和localtime()方法类似,gmtime()方法是将一个时间戳转换为UTC时区(0时区)的struct_time
time.gmtime()
time.struct_time(tm_year=2018, tm_mon=8, tm_mday=6, tm_hour=9, tm_min=34, tm_sec=48, tm_wday=0, tm_yday=218, tm_isdst=0)
# mktime(t)
#将一个struct_time转化为时间戳。
print(time.mktime(time.localtime()))
1533548114.0
1.3 格式化字符串
# asctime([t])
# 把一个表示时间的元组或者struct_time表示为这种形式:'Mon Aug 6 17:36:15 2018'。
# 如果没有参数,将会将time.localtime()作为参数传入。
time.asctime()
Mon Aug 6 17:36:15 2018
# ctime([secs])
# 把一个时间戳(按秒计算的浮点数)转化为time.asctime()的形式。如果参数未给或者为None的时候,将会默认time.time()为参数。它的作用相当于time.asctime(time.localtime(secs))。
time.ctime()
'Mon Aug 6 17:37:31 2018'
# strftime(format[, t]) : 把一个代表时间的元组或者struct_time(如由time.localtime()和
# time.gmtime()返回)转化为格式化的时间字符串。如果t未指定,将传入time.localtime()。如果元组中任何一个
# 元素越界,ValueError的错误将会被抛出。
time.strftime("%Y-%m-%d %X", time.localtime())
'2018-08-06 17:38:41'
# time.strptime(string[, format])
# 把一个格式化时间字符串转化为struct_time。实际上它和strftime()是逆操作。
time.strptime('2011-05-05 16:37:06', '%Y-%m-%d %X')
time.struct_time(tm_year=2011, tm_mon=5, tm_mday=5, tm_hour=16, tm_min=37, tm_sec=6, tm_wday=3, tm_yday=125, tm_isdst=-1)
1.4 时间函数
# sleep(secs)
# 线程推迟指定的时间运行,单位为秒。
# clock()
# 需要注意,clock()在不同的系统上含义不同。
#在UNIX系统上,它返回的是“进程时间”,它是用秒表示的浮点数(时间戳)。
# 而在WINDOWS中,第一次调用,返回的是进程运行的实际时间。而第二次之后的调用是自第一次调用以后到现在的运行时间,即两次时间差。
1.4 总结:三种格式时间转化图
2 datetime模块
datetime模块的使用与time基本相同,具体有如下的一些方法:
- datetime.date:表示日期的类。常用的属性有year, month, day
- datetime.time:表示时间的类。常用的属性有hour, minute, second, microsecond
- datetime.datetime:表示日期时间
- datetime.timedelta:表示时间间隔,即两个时间点之间的长度
- timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])
- strftime(“%Y-%m-%d”)
from datetime import datetime
# 获取当前的时间
now = datetime.now()
now
datetime.datetime(2018, 8, 6, 19, 59, 44, 43008)
delta = datetime(2018,8,6) - datetime(2017,8,6,12,0)
delta
datetime.timedelta(364, 43200)
# 获取相差得天数
delta.days
364
# 剩余得秒数
delta.seconds
43200
2.1时间日期对象转字符串
date = datetime(2018,8,6)
date
datetime.datetime(2018, 8, 6, 0, 0)
# 强制转化成字符串
str(date)
'2018-08-06 00:00:00'
# 格式化转化时间日期类型数据
date.strftime("%Y/%m/%d")
'2018/08/06'
2.2 将字符串转datetime类型
dateStr = ["7/6/2011","8/6/2011"]
[datetime.strptime(x,"%m/%d/%Y") for x in dateStr]
[datetime.datetime(2011, 7, 6, 0, 0), datetime.datetime(2011, 8, 6, 0, 0)]
# 时间日期转化工具
from dateutil.parser import parse
parse("2018-08-06")
datetime.datetime(2018, 8, 6, 0, 0)
parse("06/08/2018",dayfirst=False) # dayfirst=True 第一组代表日期,否则代表月份
datetime.datetime(2018, 6, 8, 0, 0)
parse("Jan 31 997 10:45 PM")
datetime.datetime(997, 1, 31, 22, 45)
Pandas中得时间日期转化
dateStr
['7/6/2011', '8/6/2011']
date_series = pd.to_datetime(dateStr)
date_series
DatetimeIndex(['2011-07-06', '2011-08-06'], dtype='datetime64[ns]', freq=None)
day.month
7
dateStr
['7/6/2011', '8/6/2011']
newdateStr = dateStr+[None]
idx = pd.to_datetime(newdateStr)
idx
DatetimeIndex(['2011-07-06', '2011-08-06', 'NaT'], dtype='datetime64[ns]', freq=None)
mask = pd.isnull(idx)
mask
array([False, False, True], dtype=bool)
idx[~mask]
DatetimeIndex(['2011-07-06', '2011-08-06'], dtype='datetime64[ns]', freq=None)
1 将时间日期类型作为Series得index索引
dates = [datetime(2011,1,2),datetime(2011,1,5),datetime(2011,1,7),
datetime(2011,1,8),datetime(2011,1,10),datetime(2011,1,12)]
ts = Series(np.random.randn(6),index=dates)
ts
2011-01-02 0.114065
2011-01-05 -1.835792
2011-01-07 -2.013275
2011-01-08 0.077955
2011-01-10 -0.855311
2011-01-12 -1.448982
dtype: float64
stamp = ts.index[2]
stamp
Timestamp('2011-01-07 00:00:00')
# 通过时间日期类型得行索引获取对应得value值
ts[stamp]
-2.0132746766333041
ts["1/10/2011"]
-0.85531076292809938
ts["20110110"]
-0.85531076292809938
# pd.date_range(start,periods=n)
# 从start日期开始,往后推n个周期(1天为一个周期)得时间范围
longer_str = Series(np.random.randn(1000),
index=pd.date_range("1/1/2000",periods=1000)
)
longer_str.head(10)
2000-01-01 0.360722
2000-01-02 0.380163
2000-01-03 -0.247308
2000-01-04 -0.488827
2000-01-05 -0.983483
2000-01-06 0.801973
2000-01-07 0.826445
2000-01-08 -0.430291
2000-01-09 -0.592540
2000-01-10 -0.552809
Freq: D, dtype: float64
# 得到某个时间范围内的value值
longer_str["20000102":"20000107"]
2000-01-02 0.380163
2000-01-03 -0.247308
2000-01-04 -0.488827
2000-01-05 -0.983483
2000-01-06 0.801973
2000-01-07 0.826445
Freq: D, dtype: float64
# 获取某一年的数据
longer_str["2000"].head(10)
2000-01-01 0.360722
2000-01-02 0.380163
2000-01-03 -0.247308
2000-01-04 -0.488827
2000-01-05 -0.983483
2000-01-06 0.801973
2000-01-07 0.826445
2000-01-08 -0.430291
2000-01-09 -0.592540
2000-01-10 -0.552809
Freq: D, dtype: float64
#获取某一月的数据
longer_str["2001-05"].head(10)
2001-05-01 -0.259026
2001-05-02 1.067704
2001-05-03 -0.946345
2001-05-04 -1.004247
2001-05-05 -0.217233
2001-05-06 1.146240
2001-05-07 -1.292064
2001-05-08 -0.611653
2001-05-09 -0.340308
2001-05-10 0.315475
Freq: D, dtype: float64
'''
pd.date_range(start,end,[periods])
start str 开始日期
edn str 结束日期
periods str 生成时间序列的周期
'''
index = pd.date_range("4/1/2012","6/1/2012") # start + end 组合使用
index
DatetimeIndex(['2012-04-01', '2012-04-02', '2012-04-03', '2012-04-04',
'2012-04-05', '2012-04-06', '2012-04-07', '2012-04-08',
'2012-04-09', '2012-04-10', '2012-04-11', '2012-04-12',
'2012-04-13', '2012-04-14', '2012-04-15', '2012-04-16',
'2012-04-17', '2012-04-18', '2012-04-19', '2012-04-20',
'2012-04-21', '2012-04-22', '2012-04-23', '2012-04-24',
'2012-04-25', '2012-04-26', '2012-04-27', '2012-04-28',
'2012-04-29', '2012-04-30', '2012-05-01', '2012-05-02',
'2012-05-03', '2012-05-04', '2012-05-05', '2012-05-06',
'2012-05-07', '2012-05-08', '2012-05-09', '2012-05-10',
'2012-05-11', '2012-05-12', '2012-05-13', '2012-05-14',
'2012-05-15', '2012-05-16', '2012-05-17', '2012-05-18',
'2012-05-19', '2012-05-20', '2012-05-21', '2012-05-22',
'2012-05-23', '2012-05-24', '2012-05-25', '2012-05-26',
'2012-05-27', '2012-05-28', '2012-05-29', '2012-05-30',
'2012-05-31', '2012-06-01'],
dtype='datetime64[ns]', freq='D')
# start + periods
pd.date_range("4/1/2012",periods=20)
DatetimeIndex(['2012-04-01', '2012-04-02', '2012-04-03', '2012-04-04',
'2012-04-05', '2012-04-06', '2012-04-07', '2012-04-08',
'2012-04-09', '2012-04-10', '2012-04-11', '2012-04-12',
'2012-04-13', '2012-04-14', '2012-04-15', '2012-04-16',
'2012-04-17', '2012-04-18', '2012-04-19', '2012-04-20'],
dtype='datetime64[ns]', freq='D')
time.localtime()
time.struct_time(tm_year=2018, tm_mon=8, tm_mday=6, tm_hour=15, tm_min=10, tm_sec=12, tm_wday=0, tm_yday=218, tm_isdst=0)
dateutil包里 parse 方法
from dateutil.parser import parse
parse('2018-08-06')
datetime.datetime(2018, 8, 6, 0, 0)
parse('08/06/2018',dayfirst = False)
datetime.datetime(2018, 8, 6, 0, 0)
parse('06/08/2018',dayfirst = True)
datetime.datetime(2018, 8, 6, 0, 0)