python内置库和pandas中的时间常见处理(1)

2023-02-23 20:40:32 浏览数 (1)

在进行matplotlib时间序列型图表之前,首先了解python内置库和pandas中常见的时间处理方法,本篇及之后几篇会介绍常见库的常用方法作为时间序列图表的基础。

1 python内置库的常见时间处理方法

在python中时间处理内置库为timedatetime。在使用时无需安装,直接调用即可。

python中日期格式化符号

%y 两位数的年份表示(00-99)

%Y 四位数的年份表示(000-9999)

%m 月份(01-12)

%d 月内中的一天(0-31)

%H 24小时制小时数(0-23)

%I 12小时制小时数(01-12) 如 11:19:55 AM %I:%M:%S %p

%M 分钟数(00-59)

%S 秒(00-59)

%a 本地简化星期名称 如Mon

%A 本地完整星期名称 如Monday

%b 本地简化的月份名称 如Jan

%B 本地完整的月份名称 如January

%c 本地相应的日期和时间表示

%j 年内的一天(001-366)

%U 一年中的星期数(00-53)星期天为星期的开始

%w 星期(0-6),星期天为星期的开始

%W 一年中的星期数(00-53)星期一为星期的开始

%x 本地相应的日期表示

%X 本地相应的时间表示

%Z 当前时区的名称

%% %号本身

1.1 datetime库的常见时间方法

datetime库是注重处理日期和时间的类,常见的时间类型如下表所示:

类型

描述

datetime.date

理想化的简单型日期,属性:year、month、day

datetime.time

独立于任何特定日期的理想化时间,属性:hour、minute、second、microsecond

datetime.datetime

日期和时间的结合,属性:year、month、day、hour、minute、second、microsecond

datetime.timedelta

表示两个date对象、time对象或datetime对象之间的时间间隔,精确到毫秒

1.1.1 date对象

生成date对象方法:

1)通过字符串生成(两种)

代码语言:javascript复制
#方法一,通过字符串转换函数生成date
o_date = datetime.datetime.strptime('2021/7/7', '%Y/%m/%d').date()
print(o_date, type(o_date), sep = 't')

#方法二,要求字符串必须为YYYY-MM-DD格式,是date.isoformat逆操作
o_date = datetime.date.fromisoformat('2022-07-07')
print(o_date, type(o_date), sep = 't')

输出结果:

代码语言:javascript复制
2021-07-07  <class 'datetime.date'>
2022-07-07  <class 'datetime.date'>

2)通过datetime对象生成

代码语言:javascript复制
#先生成datetime对象,再利用date方法
o_datetime = datetime.datetime.strptime('2021/7/7', '%Y/%m/%d')
print(o_datetime, type(o_date), sep = 't')
o_date = o_datetime.date()
print(o_date, type(o_date), sep = 't')

输出结果:

代码语言:javascript复制
2021-07-07 00:00:00  <class 'datetime.date'>
2021-07-07  <class 'datetime.date'>

3)调用当地日期生成date对象

代码语言:javascript复制
#4,返回当地日期,类似于date.fromtimesatmp(time.time())时间戳
o_date = datetime.date.today()
print(o_date, type(o_date), sep = 't')

输出结果:

代码语言:javascript复制
2022-07-07  <class 'datetime.date'>

4)通过时间戳获取date对象

代码语言:javascript复制
#提供参数时间戳,返回date对象,time.time()就是时间戳   
import time
o_date = datetime.date.fromtimestamp(time.time())
print(o_date, type(o_date), sep = 't')

输出结果:

代码语言:javascript复制
2022-07-07  <class 'datetime.date'>

5)通过年、星期、日生成date对象(python3.7新增)

代码语言:javascript复制
#星期为0-52,是这一年的第几星期,日为1-7,为本周的第几天,1为星期一
#以下代码输出的就是2022年第52周的第2天(周二)
o_date = date.fromisocalendar(2022, 52, 2)
print(o_date, type(o_date), sep = 't')

输出结果:

代码语言:javascript复制
2022-12-27  <class 'datetime.date'>

date对象支持的属性方法:

1)获取date对象的年月日属性(只读)

代码语言:javascript复制
o_date = datetime.date.today()
print(o_date.year, o_date.month, o_date.day, sep = 't')

输出结果:

代码语言:javascript复制
2022  7  7

2)日期增减

代码语言:javascript复制
#使用timedelta来设置增加间隔,获取当前日期前三天和后三天的日期
o_date = datetime.date.today()
future_date = o_date   datetime.timedelta(days = 3)
before_date = o_date   datetime.timedelta(days = -3)
print(future_date, before_date, sep = 't')

输出结果:

代码语言:javascript复制
2022-07-10  2022-07-04

注:timedelta只能按照天、时、分、秒增减,不能进行按月、按年增减。

如何实现按月、年增减?使用第三方库python-dateutil(注意库的名称)

代码语言:javascript复制
from dateutil.relativedelta import relativedelta
future_date = o_date   relativedelta(months = 2)
before_date = o_date   relativedelta(years = -2)
print(o_date, future_date, before_date, sep = 't')

输出结果:

代码语言:javascript复制
2022-07-07  2022-09-07  2020-07-07

3)日期替换

代码语言:javascript复制
#使用date.replace(year, month, day)
o_date = datetime.date(2022, 7, 7)
day_date = o_date.replace(day = 15)
month_date = o_date.replace(month = 9)
new_date = o_date.replace(year = 2020, month = 6, day = 13)
print(o_date, day_date, month_date, new_date, sep = 't')

输出结果:

代码语言:javascript复制
2022-07-07  2022-07-15  2022-09-07  2020-06-13

4)返回某个日期是星期的第几天

代码语言:javascript复制
#5, 返回今天是一个星期的第几天,weekday中周一为0,isoweekday中周一为1
o_date = datetime.date.today()
weekday = o_date.weekday()
isoweekday =o_date.isoweekday()
print(o_date.weekday(), isoweekday, sep = 't')

输出结果:

代码语言:javascript复制
3  4

今天是周四,在weekday中为3,在isoweekday中为4。

5)返回日历格式(年,第几周,周的第几天)

代码语言:javascript复制
#返回colendar格式,(年,第几周,周的第几天)
o_date = datetime.date.today()
print(o_date.isocalendar())

输出结果,表示今天是2022年第27周第4天:

代码语言:javascript复制
(2022, 27, 4)

6)date转字符串

代码语言:javascript复制
o_date = datetime.date.today()
#返回一个以YYYY-MM-DD表示日期的字符串
isoformat = o_date.isoformat()
date_str = o_date.__str__()  #等效isformat方法
#返回一个表示日期的字符串
ctime_date = o_date.ctime()
print(o_date, isoformat, date_str, sep = 't')

#返回指定格式的字符串(格式参考文章开头的符号)
format_1 = o_date.strftime('%y-%m')
format_2 = o_date.strftime('%Y.%m.%d %H:%M:%S')
print(o_date, format_1, format_2, sep = 't')

输出结果:

代码语言:javascript复制
2022-07-07  2022-07-07  2022-07-07
2022-07-07  22-07  2022.07.07 00:00:00

7)日期大小比较

代码语言:javascript复制
date1 = datetime.date(2022, 7, 8)
date2 = datetime.date(2022, 7, 3)
date1 < date2

输出结果为False,利用日期大小比较,并结合日期增减可以生成日期序列。

1.1.2 datetime对象

生成datetime对象方法

1)datetime.datetime方法

代码语言:javascript复制
#datetime.datetime(year, month, day, hour, minute, second, microsecond)  
import datetime
o_datetime = datetime.datetime(2022, 7, 7, 14)
print(o_datetime, type(o_datetime), sep = 't)
代码语言:javascript复制
2022-07-07 14:00:00  <class 'datetime.datetime'>

2)字符串转datetime

代码语言:javascript复制
#fromisoformat只适用于YYYY-MM-DD类型的字符串,后面的时分秒可以不要;
#strptime较为灵活,可以指定datetime样式
date_str = '2022-07-07 12:02:32'
iso_datetime = datetime.datetime.fromisoformat(date_str)

date_str = '2022/07 12:02'
str_to_date = datetime.datetime.strptime(date_str, '%Y/%m %H:%M')
print(iso_datetime, type(iso_datetime), date_str, type(str_to_date), sep = 't')
代码语言:javascript复制
2022-07-07 12:02:32  <class 'datetime.datetime'>  2022/07 12:02  <class 'datetime.datetime'>

3)利用当前日期转为datetime

代码语言:javascript复制
#当前日期转为datetime
o_datetime = datetime.datetime.today()
print(o_datetime, type(o_datetime), sep = 't')
代码语言:javascript复制
2022-07-07 12:09:32.120532  <class 'datetime.datetime'>

4)日历格式转datetime

代码语言:javascript复制
#datetime.fromisocalendar(year, week, day)
o_datetime = datetime.datetime.fromisocalendar(2022, 27, 4)
print(o_datetime, type(o_datetime), sep = 't')
代码语言:javascript复制
2022-07-07 00:00:00  <class 'datetime.datetime'>

表示2022年第27周第4天的日期

5)时间戳转datetime

代码语言:javascript复制
#datetime.datetime(time.time())
import time
o_datetime = datetime.datetime.fromtimestamp(time.time())
print(o_datetime, type(o_datetime), sep = 't')
代码语言:javascript复制
2022-07-07 12:15:20.541538  <class 'datetime.datetime'>

注:datetime对象可以转为date,但是date不可以转为datetime

datetime对象支持的属性方法

1)获取年、月、日、时、分、秒、毫秒属性(只读)

代码语言:javascript复制
o_datetime = datetime.datetime.today()
print(o_datetime.year, o_datetime.hour, sep = 't')
代码语言:javascript复制
2022  12

2)时间增减,与上文一样,不再列举

3)datetime转为date

代码语言:javascript复制
o_datetime = datetime.datetime.today()
o_date = o_datetime.date()
print(o_datetime, o_date, sep = 't')
代码语言:javascript复制
2022-07-07 12:21:40.047070  2022-07-07

4)时间替换,与上文一样,不再列举

5)datetime转为time(时分秒)

代码语言:javascript复制
o_datetime = datetime.datetime.today()
o_time = o_datetime.time()
print(o_datetime, o_time, sep = 't')
代码语言:javascript复制
2022-07-07 12:23:37.465122  12:23:37.465122

6)转星期,方法同date

7)转日历型,方法同date

8)转字符串,方法同date

代码语言:javascript复制
o_datetime = datetime.datetime.today()
isoformat = o_datetime.isoformat()
str_date = o_datetime.__str__()
str_format_date = o_datetime.strftime("%Y-%m-%d %H:%M:%S")
print(o_datetime, isoformat, str_date, str_format_date, sep = 't')
代码语言:javascript复制
2022-07-07 12:30:38.085380  2022-07-07T12:30:38.085380  2022-07-07 12:30:38.085380  2022-07-07 12:30:38

9)转timetuple,date也可以用(可以用它获取今天是该年的第几天)

代码语言:javascript复制
o_datetime = datetime.datetime.today()
time_tuple = o_datetime.timetuple()
print(time_tuple)
print('今年的第{}天'.format(time_tuple[-2]))
代码语言:javascript复制
time.struct_time(tm_year=2022, tm_mon=7, tm_mday=7, tm_hour=12, tm_min=33, tm_sec=3, tm_wday=3, tm_yday=188, tm_isdst=-1)
今年的第188天

本文列举了datetime库中datetime和date两类对象,由于篇幅限制,time和timedelta对象可以参考python官方文档,链接如下:

https://docs.python.org/zh-cn/3/library/datetime.html#datetime.date.fromisoformat

0 人点赞