python 数据分析之 时间戳操作
第一章 Python 数据分析之pandas的使用
第二章 Python 数据分析之 时间戳操作
第二章 python 数据分析之numpy的使用
第三章 python 数据可视化之matplotlib的使用
@[TOC](Python 数据分析之 时间戳操作)
一、 时间戳的基础操作
- datetime 数据包
- time 数据包
1.1 数据类型
- 时间序列的数据类型:
-
Datetime Object / String / timestamp / time tuple 代码包括两部分
-
时间数据的获取
-
时间数据的类型的相互转化
dataFrame 中 index 为时间戳可以提取
data = data_use[data_use.index.hour.values== 8] # 提取每天8点的小时数据
data = data_use[data_use.index.day.values== 8] # 提取每月8号的小时数据
data = data_use[data_use.index.month.values== 8] # 提取8月份的小时数据
data = data_use[data_use.index.year.values==2017] # 提取2017年的所有数据
from datetime import datetime
datetime.strftime('%' ) %后面跟一个控制字符
1.2 格式符 说明
%a:星期的英文单词的缩写:如星期一, 则返回 Mon
%A:星期的英文单词的全拼:如星期一,返回 Monday
%b:月份的英文单词的缩写:如一月, 则返回 Jan
%B:月份的引文单词的缩写:如一月, 则返回January
%c:返回datetime的字符串表示,如03/08/15 23:01:26
%d:返回的是当前时间是当前月的第几天
%f:微秒的表示: 范围: [0,999999]
%H:以24小时制表示当前小时
%I:以12小时制表示当前小时
%j:返回 当天是当年的第几天 范围[001,366]
%m:返回月份 范围[0,12]
%M:返回分钟数 范围 [0,59]
%P:返回是上午还是下午–AM or PM
%S:返回秒数 范围 [0,61]。。。手册说明的
%U:返回当周是当年的第几周 以周日为第一天
%W:返回当周是当年的第几周 以周一为第一天
%w:当天在当周的天数,范围为[0, 6],6表示星期天
%x:日期的字符串表示 :03/08/15
%X:时间的字符串表示 :23:22:08
%y:两个数字表示的年份 15
%Y:四个数字表示的年份 2015
%z:与utc时间的间隔(如果是本地时间,返回空字符串)
%Z:时区名称(如果是本地时间,返回空字符串)
二、datetime 包
2.1 引入包库
import datetime
2.2 时间数据的获取部分
# 获取当前时间点
datetime.datetime.now()
# datetime.datetime(2019, 7, 23, 10, 31, 33, 859647)
### # 获取当天时间
datetime.date.today()
# datetime.date(2019, 7, 23)
2.2 时间差操作 datetime.timedelta
datetime.timedelta(perm)可以直接进行+、-操作
perm: datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0,
minutes=0, hours=0, weeks=0)
1. days=N,天;
2. seconds=N,秒
3. microseconds,毫秒
4. minutes,分钟
5. hours,小时
6. weeks,周
# 获取前天的时间
# datetime.data.today()+datetime.timedelta(days=N)
# 获取前N天的消息
datetime.date.today() + datetime.timedelta(days=1)
# datetime.date(2019, 7, 24)
# 获取当前开始时间
datetime.datetime.combine(datetime.date.today(), datetime.time.min)
# datetime.datetime(2019, 7, 23, 0, 0)
# 获取当天结束时间
datetime.datetime.combine(datetime.date.today(), datetime.time.max)
# datetime.datetime(2019, 7, 23, 23, 59, 59, 999999)
# 获取两个时间之间的时间差,之间的秒数
senconds_diff=(datetime.datetime(2020,1,13,12,0,0) - datetime.datetime.now()).total_seconds()
# 获取时间戳相差月数量
(datetime.datetime(2020,1,13,12,0,0) - datetime.datetime.now()).total_month()
(endTime2 - startTime2).seconds :相差多少秒
# senconds_diff//60 ---->分钟数
# senconds_diff//3600 ---->对应小时数
# senconds_diff//3600//24 ---->对应天数
# 15038213.602988
2.3 时间戳互换
# 当前时间对应时间戳
new_stamp = datetime.now().timestamp()
# 本地时间
datetime.fromtimestamp(now_stamp)
# UTC标准时间
datetime.utcfromtimestamp(new_stamp)
# 获取本周最后一天
# datetime.date : 获取年月日
# datetime.datetime :获取年月日小时分钟秒
today = datetime.date.today()
# .weekday()
print(today)
# 2019-07-23
sundays = today+datetime.timedelta(6 - today.weekday())
sundays
# datetime.date(2019, 7, 28)
# 获取本月最后一天
import calendar # 添加日历
today = datetime.date.today()
print(today)
# 2019-07-23
a,last_day_num = calendar.monthrange(today.year, today.month)
a,last_day_num
last_day = datetime.date(today.year,today.month,last_day_num)
last_day
# datetime.date(2019, 7, 31)
# 获取上个月的最后一天
today = datetime.date.today()
first = datetime.date(day=1, month=today.month, year=today.year)# 本月第一天
lastMonth = first - datetime.timedelta(days=1)# 本月-一天
lastMonth
# datetime.date(2019, 6, 30)
2.4 数据关系的相互转化
2.4.1 datetime <=> string
# 关系转换
1. datetime -> string
string0 = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(type(string0))
# <class 'str'>
2. datetime<- string
datetime0= datetime.datetime.strptime("2019-12-31 18:20:10",'%Y-%m-%d %H:%M:%S')
print(type(datetime0))
# <class 'datetime.datetime'>
3. datetime1 = datetime.datetime.strptime("2020-04-23T02:00:00Z","%Y-%m-%dT%H:%M:%SZ")
# 将str转化为2020-04-23 02:00:00 时间戳
2.4.2 datetime <=> timetuple
import time
# 1.datetime -> timetuple
now = datetime.datetime.now().timetuple()
print(now,type(now))
print('=='*30)
# 2.datetime <- timetuple:需要分两步进行,timetuple--> timestap-->datetime
timestap = time.mktime(now)
print(timestap,type(timestap))
# time.struct_time(tm_year=2019, tm_mon=7, tm_mday=23, tm_hour=11, tm_min=29, tm_sec=25, tm_wday=1, tm_yday=204, tm_isdst=-1) <class 'time.struct_time'>
timetuple = datetime.datetime.fromtimestamp(timestap)
print('=='*30)
# ============================================================
print(timetuple,type(timetuple))
# # 1563852565.0 <class 'float'> 2019-07-23 11:29:25 <class 'datetime.datetime'>
2.4.3 datetime <=> date
# 1.datetime -> date
date = datetime.datetime.now().date()
print(date,type(date))
# 2019-07-23 <class 'datetime.date'>
# 2. date -> datetime
today = datetime.date.today() # date
datetime1 = datetime.datetime.combine(today,datetime.time())
print(datetime1,type(datetime1))
# 2019-07-23 00:00:00 <class 'datetime.datetime'>
datetime2 = datetime.datetime.combine(today,datetime.time.min)
print(datetime2,type(datetime2))
# 2019-07-23 00:00:00 <class 'datetime.datetime'>
2.4.4 datetime <=> timestamp
# 1.datetime -> timestamp
now = datetime.datetime.now()
timestaps = time.mktime(now.timetuple())
print(timestaps)
# 1563859197.0
# 2. timestamp ->datetime
datetime2 = datetime.datetime.fromtimestamp(timestaps)
print(datetime2)
# 2019-07-23 13:19:57
2.5 datetime数据修改
#时间修改
datetime.datetime.replace(hour=23,minute=0,second=0,microsecond=0)
def get_cache_times():
"""根据日期获取当天23时间"""
date_23 = datetime.now().replace(hour=23,minute=0,second=0,microsecond=0)
before_data_23 = date_23 - timedelta(days=29)
before_0 = before_data_23.replace(hour=0,minute=0,second=0,microsecond=0)
return date_23,before_0
ts = pd.date_range('2019-10-24 00:00','2019-10-24 23:00',freq='H')
ts_day =pd.to_datetime([t.replace(hour=0) for t in ts])
# 输出结果
# DatetimeIndex(['2019-10-24', '2019-10-24', #'2019-10-24', '2019-10-24',
# '2019-10-24', '2019-10-24',
# '2019-10-24', '2019-10-24',
# '2019-10-24', '2019-10-24', '2019-10-24', '2019-10-24',
# '2019-10-24', '2019-10-24', '2019-10-24', '2019-10-24',
# '2019-10-24', '2019-10-24', '2019-10-24', '2019-10-24',
# '2019-10-24', '2019-10-24', '2019-10-24', '2019-10-24'],
# dtype='datetime64[ns]', #freq=None)
2.6 获取当天的时间:
# 1) 获取当前日期和时间
today = datetime.today() # 返回当前时间时分秒都为0
print("当前时间")
print(today)
# datetime.datetime(2019, 11, 4, 16, 27, 20, 826398)
now = datetime.now() # 返回当前日期和时间和today相同
now.hour # 时
now.minute # 分
now.isoweekday()# 返回的1-7代表周一--周日;
now.weekday()# 返回的0-6代表周一--到周日
# 而标准格式种%w 1-6表示周一--周六,0代表周日
print( today1 )
today2 = datetime.utcnow() # 返回当前东八区时间就是比当时时间少8个小时
print(today2)
三、time 包
3.1 引入包
improt time
from time import time, localtime, sleep
3.2 time localtime() 方法
作用: 格式化本地时间
localtime() == localtime(time()) :结果相同
localtime([sec]) : 输入参数以秒计算,如果没有输入则为本地当前时间
返回结果为:time.struct_time(tm_year=2020, tm_mon=1, tm_mday=9, tm_hour=13, tm_min=37, tm_sec=47, tm_wday=3, tm_yday=9, tm_isdst=0)
参数解释: int tm_sec; /* 秒 – 取值区间为[0,59] */ int tm_min; /* 分 - 取值区间为[0,59] */ int tm_hour; /* 时 - 取值区间为[0,23] */ int tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */ int tm_mon; /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */ int tm_year; /* 年份,其值等于实际年份减去1900 */ int tm_wday; /* 星期 – 取值区间为[0,6],其中0代表星期一,1代表星期二,以此类推 */ int tm_yday; /* 从每年的1月1日开始的天数 – 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */ int tm_isdst; /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的时候,tm_isdst为0;不了解情况时,tm_isdst()为负。
3.3 time gmtime()方法
作用: 将时间戳转化为UTC(0时区)的struct_time
格式: time.gmtime([sec]),sec为转换为time.struct_time类型的对象的秒数
结果: 返回的结果和time localtime() 的结果相同,返回参数也相同
3.4 time mktime() 方法
作用:返回的结果与localtime和gmtime相反,返回表示时间的浮点数
格式: time.mktime(t),t 结构化的时间或者完整的9位元组元素
# 例子:
t = (2020, 2, 17, 17, 3, 38, 1, 48, 0)
secs = time.mktime(t)
print(secs)
print("asctime(localtime(secs)): %s" % time.asctime(time.localtime(secs)))
# 结果
#1581930218.0 浮点数
#asctime(localtime(secs)): Mon Feb 17 17:03:38 #2020
mktime(gmtime(time())) # 可以相互转化
3.5 time strftime() / time strptime() 方法
strftime(): 结果为字符串
函数接收以时间元组,并返回以可读字符串表示的当地时间,格式由参数format决定
import time
print(time.time())
print(time.localtime(time.time()))
time.strftime("%b %d %Y %H:%M:%S",time.localtime(time.time()))
#1578550655.728434
#time.struct_time(tm_year=2020, tm_mon=1, #tm_mday=9, tm_hour=14, tm_min=17, tm_sec=35, #tm_wday=3, tm_yday=9, tm_isdst=0)
#'Jan 09 2020 14:17:35'
strptime() : 结果为时间元组
函数接受字符串,并返回对应的时间元组
import time
#print(time.time())
#print(time.localtime(time.time()))
# str --> tuple time 的时间格式需要对应
str_time = time.strftime("%b %d %Y %H:%M:%S",time.localtime(time.time()))
tuple_time = time.strptime(str_time,"%b %d %Y %H:%M:%S")
str_time1 = time.strftime("%y-%m-%d %H:%M:%S",time.localtime(time.time()))
tuple_time1 = time.strptime(str_time1,"%y-%m-%d %H:%M:%S")
print(tuple_time)
print(tuple_time1)
# 结果
#1578551229.4638183
#time.struct_time(tm_year=2020, tm_mon=1, #tm_mday=9, tm_hour=14, tm_min=27, tm_sec=9, #tm_wday=3, tm_yday=9, tm_isdst=0)
#time.struct_time(tm_year=2020, tm_mon=1, #tm_mday=9, tm_hour=14, tm_min=27, tm_sec=9, #tm_wday=3, tm_yday=9, tm_isdst=-1)
#time.struct_time(tm_year=2020, tm_mon=1, #tm_mday=9, tm_hour=14, tm_min=27, tm_sec=9, #tm_wday=3, tm_yday=9, tm_isdst=-1)
共有条评论 网友评论