日期与时间
datetime
表示的时间需要时区信息才能确定一个特定的时间,否则只能视为本地时间。如果要存储
datetime
,最佳方法是将其转换为timestamp再存储,因为timestamp的值与时区完全无关。
Python中关于时间、日期的处理库有三个:time、datetime和Calendar。
- datetime又有datetime.date、datetime.time、datetime.datetime三个类
- 时间又可以分为时间戳、本地时间和UTC时间(世界标准时间)
from time import time
from datetime import datetime
时间序列的几种内容
- 时间戳 (timestamp),特定的时刻
- 固定时期 (period),如2017年1月或2017年全年
- 时间间隔 (internal) ,由起始时间和结束时间戳表示。时期 (period) 可以看做间隔的一个特例
datetime模块
datetime是Python处理日期和时间的标准库。
from datetime import datetime
datetime模块。该模块中包含4个主要的类:
- datetime.date:日期类,只包含年、月、日、星期等日期信息。
- datetime.time:时间类,只包含时、分、秒、微秒等时间信息。
- datetime.datetime:日期时间类,包含以上两者的全部信息。
- datetime.timedelta:时间日期差值类,用来表示两个datetime之间的差值(日、秒、毫秒)。
12345678 > # 获取当前时间> >>> from datetime import datetime> >>> now = datetime.now() # 获取当前datetime> >>> print(now)> 2015-05-18 16:28:07.198690> >>> print(type(now))> <class 'datetime.datetime'>>
>
注意到
datetime
是模块,datetime
模块还包含一个datetime
类,通过from datetime import datetime
导入的才是datetime
这个类。如果仅导入
import datetime
,则必须引用全名datetime.datetime
。
datetime.now()
返回当前日期和时间,其类型是datetime
。
时间获取
- datetime.datetime.now():获取当前日期与时间
- datetime.datetime(2012, 1, 12):获取指定日期与时间
####指定部分
datetime.year : 获取日期与时间的指定部分
datetime.year
datetime.month
datetime.day
datetime.hour
datetime.minute
datetime.second
datetime.microsecond
In range(1000000)
datetime.date():获得日期部分
- datetime.time()
- datetime.weekday():将星期几作为整数返回,其中星期一为0,星期日为6
- datetime.isoweek():将星期几作为整数返回,星期一为1,星期日为7
字符串转换
- datetime.strftime( format ) :时间转为字符串 f:表示from
- strftime() 用来格式化 datetime对象
format : ‘%Y-%M-%D %H:%M:%S’
|
|
- datetime.strptime( ‘date_string’, ‘%Y-%M-%D’):字符串转为时间格式
- datetime.strptime 是通过已知的格式进行日期解析的方式。但每次都必须要编写格式定义。
- parser.parse(‘str’ ,dayfirst =True):可以解析几乎所有人类能够理解的日期表示形式(中文除外)
- 对于常见的日期格式,可以使用
dateutil
第三方包中的parser.parse
方法 - 注意:它并不是一个完美的工具;因为会把一些原本不是日期的字符串认作是日期(比如 “42”会被解析为2042年的今天)
- 对于常见的日期格式,可以使用
dayfirst =True ,将日期显示在最前面;因为国际通用格式中,日通常排在月的前面。
|
|
timedelta对象 + 加减
datetime.timedelta 表示两个datetime之间的时间差。
给datetime对象加上一个或多个 timedelta,会产生一个新的对象;
now + timedelta(days=n, hours=m):在原有基础上加减日期
- 对日期和时间进行加减实际上就是把datetime往后或往前计算,得到新的datetime。加减可以直接用
+
和-
运算符,不过需要导入timedelta
这个类:
- 对日期和时间进行加减实际上就是把datetime往后或往前计算,得到新的datetime。加减可以直接用
years
months
days
hours
minutes
seconds
|
|
time模块
在time模块中,时间有三种表现形式:
- 时间戳,一般指Unix时间戳,是从1970年开始到现在的秒数。
- 1970年以前的时间timestamp为负数
- 本地时间的struct_time形式:一个长度为11的命名元组,第一位为年,第二位为月….
- UTC时间的struct_time形式:一个长度为11的命名元组,类似于上个,只不过为UTC时间
其中后两者的类型一致,区别在于一个是本地时间(localtime),一个是utc时间。
时间获取
|
|
字符串转换
- time.strptime():字符串转为时间格式
- time.strftime():时间格式转为字符串
|
|
datetime 与 timestamp转换
在计算机中,时间实际上是用数字表示的。我们把1970年1月1日 00:00:00 UTC+00:00时区的时刻称为epoch time,记为0
(1970年以前的时间timestamp为负数),当前时间就是相对于epoch time的秒数,称为timestamp
|
|
可见timestamp的值与时区毫无关系,因为timestamp一旦确定,其UTC时间就确定了,转换到任意时区的时间也是完全确定的,这就是为什么计算机存储的当前时间是以timestamp表示的,因为全球各地的计算机在任意时刻的timestamp都是完全相同的(假定时间已校准)。
datetime 转 timestamp
- dt.timestamp():把datetime对象转化为timestamp
|
|
timestamp 转 datetime
- datetime.fromtimestamp(t):从timestamp 转为datetime(本地时间)
- 注意到timestamp是一个浮点数,它没有时区的概念,而datetime是有时区的。上述转换是在timestamp和本地时间做转换。
- datetime. utcfromstimestamp(t):从timestamp 转为datetime(UTC时间)
|
|
类型和时间戳、struct_time类型的相互转换
|
|
时区
本地时间转UTC时间
本地时间是指系统设定时区的时间,例如北京时间是UTC+8:00时区的时间,而UTC时间指UTC+0:00时区的时间。
一个datetime
类型有一个时区属性tzinfo
,但是默认为None
,所以无法区分这个datetime
到底是哪个时区,除非强行给datetime
设置一个时区:
|
|
时区转换
- utcnow():获取当前的UTC时间
- 时区转换的关键在于,拿到一个
datetime
时,要获知其正确的时区,然后强制设置时区,作为基准时间。 - 利用带时区的
datetime
,通过astimezone()
方法,可以转换到任意时区。
|
|
注:不是必须从UTC+0:00时区转换到其他时区,任何带时区的
datetime
都可以正确转换,例如上述bj_dt
到tokyo_dt
的转换。
格式定义
datetime格式定义
代码 | 说明 |
---|---|
%Y | 4位数的年 |
%y | 2位数的年 |
%m | 2位数的月 [01, 12] |
%d | 2位数的日 [01, 31] |
%F | %Y-%m-%d 简写形式;2012-04-18 |
%D | %m/%d/%y 简写形式;04/18/12 |
%H | 时间(24小时制) [00, 23] |
%I | 时间(12小时制) [00, 12] |
%M | 2位数的分钟 [00, 59] |
%S | 秒 [00, 61] (秒60和61用于闰秒) |
%w | 用整数表示的星期几 (星期天为第0天) [0, 6] |
%U | 每年的第几周 [00, 53]。星期天被认为是每周的第一天,每年第一个星期天之前的那几天被认为是 “第0周” |
%W | 每年的第几周 [00, 53]。星期一被认为是每周的第一天,每年第一个星期一之前的那几天被认为是 “第0周” |
%z | 以+HHMM 或-HHMM 表示的UTC时区偏移量 |
特定于当前环境的日期格式
代码 | 说明 |
---|---|
%a | 星期几的简写 |
%A | 星期几的全称 |
%b | 月份的简写 |
%B | 月份的全称 |
%c | 完成的日期和时间;Tue 01 May 2012 04:20:57 pm |
%p | 不同环境中的AM 或PM |
%x | 适用于当前环境的日期格式 ;若在美国, “May 1 2012” 会产生 “05/01/2012” |
%X | 适用于当前环境的时间格式; “04:24:12 PM” |
【实战演练】
输出为 月-日格式
时间序列
pandas最基本的时间序列类型就是以时间戳为索引的Series;
当创建一个带有DatatimeIndex 的Series时,pandas就会知道该对象是一个时间序列
索引是 时间格式的字段;