Day19.python时间和日期

时间:2022-07-25
本文章向大家介绍Day19.python时间和日期,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Python时间和日期

datetime模块专门用于时间和日期的处理

常用的功能有以下几个:

datetime.now() & datetime.today()

 import datetime
 print(datetime.datetime.now())
 
 # datetime.today()
 #2020-09-21 23:13:05.245157
 print(datetime.datetime.today())
 #2020-09-21 23:13:57.062886

datetime.strptime()

 print(datetime.datetime.strptime('2020/08/09',format('%Y/%m/%d')))
 #2020-08-09 00:00:00
 print(datetime.datetime.strptime('20-08-09',format('%y-%m-%d')))
 #2020-08-09 00:00:00

datetime.strftime()

接收以时间元组,并返回以可读字符串表示的当地时间,格式由参数format决定。

 dt = datetime.datetime.now()  
 print("======================")
 print('时间:(%Y-%m-%d %H:%M:%S %f): ',dt.strftime( '%Y-%m-%d %H:%M:%S %f' ) )
 print('时间:(%Y-%m-%d %H:%M:%S %p): ' , dt.strftime( '%y-%m-%d %I:%M:%S %p' ) )
 print('星期缩写%%a: %s '  % dt.strftime( '%a' ))  
 print('星期全拼%%A: %s '  % dt.strftime( '%A' ))  
 print('月份缩写%%b: %s '  % dt.strftime( '%b' )  )
 print('月份全批%%B: %s '  % dt.strftime( '%B' ))  
 print('日期时间%%c: %s '  % dt.strftime( '%c' ) )
 print('今天是这周的第%s天 '  % dt.strftime( '%w' ) )
 print( '今天是今年的第%s天 '  % dt.strftime( '%j' ))  
 print('今周是今年的第%s周 '  % dt.strftime( '%U' ) )
 print('今天是当月的第%s天 '  % dt.strftime( '%d' ))
 
 '''
 ======================
 时间:(%Y-%m-%d %H:%M:%S %f):  2020-09-21 23:30:51 573645
 时间:(%Y-%m-%d %H:%M:%S %p):  20-09-21 11:30:51 PM
 星期缩写%a: Mon
 星期全拼%A: Monday
 月份缩写%b: Sep
 月份全批%B: September
 日期时间%c: Mon Sep 21 23:30:51 2020
 今天是这周的第1天
 今天是今年的第265天
 今周是今年的第38周
 今天是当月的第21天
 '''

时间日期的应用场景

1.简介

在编写代码时,往往涉及时间、日期、时间戳的相互转换。

2.示例

 # 引入模块
 import time, datetime

2.1 str类型的日期转换为时间戳

 # 字符类型的时间
 
 testStr = '2020-09-21 23:26:33'
 
 # 转为 时间数组
 timeArray = time.strptime(testStr, "%Y-%m-%d %H:%M:%S")
 print(timeArray)
 
 # timeArray可以调用tm_year等
 print(timeArray.tm_year)  # 2020
 
 # 转为时间戳
 timeStamp = int(time.mktime(timeArray))
 print(timeStamp)  # 1600701993
 
 # 结果如下
 time.struct_time(tm_year=2020, tm_mon=9, tm_mday=21, tm_hour=23, tm_min=26, tm_sec=33, tm_wday=0, tm_yday=265, tm_isdst=-1)
 2020
 1600701993

2.2 更改str类型日期的显示格式

 testStr1 = "2020-09-21 23:40:00"
 # 转为数组
 timeArray = time.strptime(testStr1, "%Y-%m-%d %H:%M:%S")
 # 转为其它显示格式
 otherStyleTime = time.strftime("%Y/%m/%d %H:%M:%S", timeArray)
 print (otherStyleTime)
 
 tss3 = "2020/09/21 23:40:00"
 timeArray = time.strptime(tss3, "%Y/%m/%d %H:%M:%S")
 otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
 print (otherStyleTime)
 
 
 """
 -----------------------
 2020/09/21 23:40:00
 2020-09-21 23:40:00
 ======================
 
 """

2.3 时间戳转换为指定格式的日期

 # 使用time
 timeStamp = 1600701993
 timeArray = time.localtime(timeStamp)
 otherStyleTime = time.strftime("%Y--%m--%d %H:%M:%S", timeArray)
 print(otherStyleTime)  # 2020--09--21 23:26:33
 # 使用datetime
 timeStamp = 1600101993
 dateArray = datetime.datetime.fromtimestamp(timeStamp)
 otherStyleTime = dateArray.strftime("%Y--%m--%d %H:%M:%S")
 print(otherStyleTime)  # 2020--09--15 00:46:33
 # 使用datetime,指定utc时间,相差8小时
 timeStamp = 1600201993
 dateArray = datetime.datetime.utcfromtimestamp(timeStamp)
 otherStyleTime = dateArray.strftime("%Y--%m--%d %H:%M:%S")
 print(otherStyleTime)  # 2020--09--15 20:33:13

2.4 获取当前时间并且用指定格式显示

 print("+++++++++++++++++++++++++++++++++++++++++++")
 # time获取当前时间戳
 now = int(time.time())     # 1533952277
 timeArray = time.localtime(now)
 print (timeArray)
 otherStyleTime = time.strftime("%Y--%m--%d %H:%M:%S", timeArray)
 print (otherStyleTime)
 
 # 结果如下
 """
 time.struct_time(tm_year=2020, tm_mon=9, tm_mday=21, tm_hour=23, tm_min=45, tm_sec=53, tm_wday=0, tm_yday=265, tm_isdst=0)
 2020--09--21 23:45:53
 
 """
 
 
 # datetime获取当前时间,数组格式
 now = datetime.datetime.now()
 print (now)
 otherStyleTime = now.strftime("%Y--%m--%d %H:%M:%S")
 print (otherStyleTime)
 
 # 结果如下:
 
 """
 2020-09-21 23:45:53.543487
 2020--09--21 23:45:53
 """

日期函数 time模块函数

这里说的字符串不是一般意义上的字符串,是指在读取日期类型的数据时,如果还没有及时解析字符串,它就还不是日期类型,那么此时的字符串该怎么与时间戳之间进行转换呢?

表示日期时间常用三种形式:

  1. 秒为单位的浮点数
  2. struct_time 元组
  3. 时间字符串
 import time;  # 引入time模块
 ticks = time.time()
 print ("当前时间戳为:", ticks)
 
 当前时间戳为: 1600704429.9781017
秒为单位的浮点数 转换为 时间元组
 tm_struct = time.localtime(ticks)
 print(tm_struct)
 
 time.struct_time(tm_year=2020, tm_mon=9, tm_mday=22, tm_hour=0, tm_min=8, tm_sec=2, tm_wday=1, tm_yday=266, tm_isdst=0)

有时我们需要得到 格林威治时间,那么可以用time.gmtime() 函数

 #格林威治时间
 print(time.gmtime(ticks))
 
 
 time.struct_time(tm_year=2020, tm_mon=9, tm_mday=21, tm_hour=16, tm_min=9, tm_sec=18, tm_wday=0, tm_yday=265, tm_isdst=0)
时间元组转换为秒为单位的浮点数
 print(time.mktime(tm_struct))
 
 1600704621.0
时间元组转换为时间字符串

转换方法有很多,最简单的是 asctime():

 time_str = time.asctime( tm_struct )
 print(time_str)
 
 """
 Tue Sep 22 00:12:14 2020
 """

如果要精确控制格式,我们可以使用 strftime():

 tm_1=time.strftime("%Y-%m-%d %H:%M:%S", tm_struct)
 tm_2=time.strftime("%a %b %d %H:%M:%S %Y", tm_struct)
 print(tm_1)
 print(tm_2)
 
 """
 2020-09-22 00:14:13
 Tue Sep 22 00:14:13 2020
 """
时间字符串 转换为 时间元组

函数 time.strptime() 可以完成这个转换,下面是个例子

 tm2_struct = time.strptime('2020-09-22 01:34:50', "%Y-%m-%d %H:%M:%S")
 print(tm2_struct)
 
 """
 time.struct_time(tm_year=2020, tm_mon=9, tm_mday=22, tm_hour=1, tm_min=34, tm_sec=50, tm_wday=1, tm_yday=266, tm_isdst=-1)
 """
秒为单位的浮点数 转换为 时间字符串

time.ctime() 类似于 time.asctime(), 请看下面的例子:

 tm_3=time.ctime(ticks)
 print(tm_3)
 
 """
 Tue Sep 22 00:17:54 2020
 
 """
 #如果想精确控制输出的字符串,我没查到有现成的函数。估计只能先转成元组,然后在格式化成字符串。
 #小编写了个转换函数:
 
 def time2str(ticks, fmt='%a %b %d %H:%M:%S %Y'):
     tm = time.localtime(ticks)
     return time.strftime(fmt, tm)
时间字符串 转换为 秒为单位的浮点数
 def str2time(str, fmt='%a %b %d %H:%M:%S %Y'):
     tm = time.strptime(str, fmt)
     return time.mktime(tm)
 
 # 这里也是参考函数

作业练习

根据起始和终止日期生成中间日期

pandas.to_datetimeargerrors ='raise'utc = Noneformat = Noneunit = None )将字符串转换为日期函数

 #转换时间字符串格式,方法二:
 import pandas as pd
 start = pd.to_datetime("20200922")
 print("===================================")
 print(start)
 s=start.strftime('%Y-%m-%d') # 将datetime转为字符串,并以'%Y-%m-%d'格式输出
 print(s)
 print("===================================")
 
 """
 ==================================
 2020-09-22 00:00:00
 2020-09-22
 ==================================
 """

编写函数:

 import time;  # 引入time模块
 from pandas import DatetimeIndex
 
 
 def date_range(cls, start=None, end=None, periods=None, freq=None, input_format=None, out_format=None):
     """
     生成时间序列
     :param start: 序列开始时间
     :param end: 序列结束时间, 给定start时, 结束时间包含end
     :param periods: int, 生成的时间序列长度
     :param freq: 要生成时间序列的时间间隔
     :param out_format: 是否输出格式化后的字符串, 若要输出可指定输出格式. "%Y-%m-%d %H:%M:%S"
     :param input_format: 若start或end是字符串且无法自动推断时间格式则需指定格式
     :return: [date or date_str]
 """
 
 start = pd.to_datetime("20200918")
 end = pd.to_datetime("20200922")
 pd.date_range(start, end)
 DatetimeIndex(['2020-09-28', '2020-09-29', '2020-09-30', '2020-09-13', '2020-06-01', '2020-06-02'])

例题1:

 #例1:
 dates = ["20200912","20200922"]
 def create_dates(dates):
     """
     :param dates: ["20200912","20200922"]
     :return:
     """
     start = pd.to_datetime(dates[0])
     end = pd.to_datetime(dates[1])
     dates = pd.date_range(start, end)  # 生成时间字符串列表
     dates = dates.strftime('%Y%m%d')   #格式化时间数据
     return list(dates)
 
 print("例1")
 print(create_dates(dates))
 
 
 """
 例1
 ['20200912', '20200913', '20200914', '20200915', '20200916', '20200917', '20200918', '20200919', '20200920', '20200921', '20200922']
 
 """

例题2:

 #例2
 
 df = pd.DataFrame({'year': [2019, 2020],
                        'month': [2, 3],
                        'day': [4, 5]})
 pd.to_datetime(df)
 
 print("例2")
 print(pd.to_datetime(df))
 
 
 """
 例2
 0   2019-02-04
 1   2020-03-05
 dtype: datetime64[ns]
 """