文章目录 一、time 模块 1、时间格式转换图 2. struct_time 元组元素结构 3. format time 结构化表示 二、datetime 模块 1. date类 2. 方法和属性 3. datetime 类 三、timedelta 类的时间加减 四、时间处理基础  
 
 
Python 中提供了对时间日期的多种多样的处理方式,主要是在 time 和 datetime 这两个模块里。   
 一、time 模块  
time 模块不牵扯时区的问题,便于计算。 (1) timestamp 时间戳,时间戳表示的是从 1970 年 1 月 1 日 00:00:00 开始按秒计算的偏移量。 (2) struct_time 时间元组,共有九个元素组。 (3) format time 格式化时间,已格式化的结构使时间更具可读性。包括自定义格式和固定格式。   
 1、时间格式转换图  
 
主要 time 生成方法和 time 格式转换方法实例如下: 首先,我们导入 time 模块,便于我们后续的操作。   
import  time
  
然后,我们生成 timestamp ,他是一个浮点型数据。   
time. time( ) 
  
 
int ( time. time( ) ) 
  
我们可以知道一个程序消耗的时间,通过设置程序开始时间和程序结束时间,中间执行一个循环语句,这里以累加到 10000 为例。   
start_time =  time. time( )  
s =  ""  
for  i in  range ( 10000 ) :      
s +=  str ( i)   
end_time =  time. time( )   
print ( "程序消耗时间=" , end_time- start_time)  
  
我们也可以通过 time 模块调用本地时间,通过生成 struct_time 完成。   
my_time =  time. localtime( )  
print ( my_time)   
print ( my_time. tm_year)  
print ( my_time. tm_mon)  
print ( my_time. tm_mday)  
  
我们可以将 timsstamp 转化为 struct_time。   
time. localtime( 1650177058 )  
  
可以将格式化字符串输入到 struct_time。   
time. strptime( '2011-05-05 16:37:06' ,  '%Y-%m-%d %X' )  
  
 
time. mktime( time. strptime( '2011-05-05 16:37:06' ,  '%Y-%m-%d %X' ) )  
  
我们可以生成 format_time,产生满足我们格式要求的时间。 示例 1:   
time. strftime( "%Y-%m-%d %X" , time. localtime( ) )  
  
 
time. strftime( "%Y-%m-%d" )  
  
 
time. strftime( "%m-%d-%Y" )  
  
 2. struct_time 元组元素结构  
 
属性 值 tm_year(年) xxxx 年,比如 2011 tm_mon(月) 1 - 12 tm_mday(日) 1 - 31 tm_hour(时) 0 - 23 tm_min(分) 0 - 59 tm_sec(秒) 0 - 61 tm_wday(weekday) 0 - 6(0表示周日) tm_yday(一年中的第几天) 1 - 366 tm_isdst(是否是夏令时) 默认为-1 
其具体如下作用: (1) 取得时间戳/时间格式的字符串中对应的年/月/日等信息。 (2) 作为时间戳和字符串时间之间的桥梁。 具体可见如下示例:   
time_stuct =  time. strptime( '2011-05-07 16:37:06' ,  '%Y-%m-%d %X' )  
print ( time_stuct. tm_year)  
print ( time_stuct. tm_mon)  
print ( time_stuct. tm_mday)  
print ( time_stuct. tm_hour)  
print ( time_stuct. tm_min)  
my =  'aaa'  
'%s' %  my 
my_int =  1  
'%d' %  my_int  
"我们在{}工作" . format ( '家里' )  
addr =  "家里"   
f"我们在 { addr} 工作"  
  
 3. format time 结构化表示  
 
属性 含义 %Y -年 [0001,…,2018,2019,…,9999] %m -月 [01,02,…,11,12] %d -天 [01,02,…,30,31] %M -分钟 [00,01,…,58,59] %S -秒 [00,01,…,58,61] %X 本地相应时间 %y 去掉世纪的年份(00 - 99) 
 
time. strftime( "%Y-%m-%d %X" ) 
  
 
time. strftime( "%Y-%m-%d" ) 
  
 
time. strftime( "%m" ) 
  
我们可以通过 time 运算获取我们想要的时间点,并按 %Y-%m-%d %X 的形式表达出来。   
import  time 
t1 =  time. time( )  
t2= t1+ 24 * 60 * 60   
time. strftime( "%Y-%m-%d %X" , time. localtime( t2) ) 
  
或者通过 time 进行暂停操作,例如火箭发射,我们在循环结束后暂停 1s,然后进行下一个语句。   
for  i in  range ( 5 ) : print ( '\r' , ' %s 秒!'  %  ( 5 - i) ,  end= '' ) time. sleep( 1 )  
print ( '\r' , "发射!!!!" ) 
  
 二、datetime 模块  
datatime 模块重新封装了time模块,提供更多接口,提供的类有:date,time,datetime、timedelta,tzinfo 等。   
 1. date类  
 
datetime. date( year,  month,  day) 
  
有静态方法和字段两种方法。 date.today():返回一个表示当前本地日期的date对象。 date.fromtimestamp(timestamp):根据给定的时间戮,返回一个date对象。 具体可见如下示例: 示例 1:   
from  datetime import  date 
import  time 
print ( 'date.today():' ,  date. today( ) )  
print ( 'date.fromtimestamp():' ,  date. fromtimestamp( time. time( ) ) ) 
  
 
from  datetime import  date 
print ( type ( date. fromtimestamp( 1650177058 ) ) )  
print ( date. fromtimestamp( 1650177058 ) ) 
  
 2. 方法和属性  
可以通过 d1 = date(2011,06,03) 生成 date 对象 。 其具体含义可见下述表格。   
属性 含义 d1.year 年 d1.month 月 d.day 日 d1.replace(year, month, day) 生成一个新的日期对象,用参数指定的年,月,日代替原有对象中的属性。(原有对象仍保持不变) d1.timetuple() 返回日期对应的time.struct_time对象 d1.weekday() 返回weekday,如果是星期一,返回0;如果是星期2,返回1,以此类推 d1.isoweekday() 返回weekday,如果是星期一,返回1;如果是星期2,返回2,以此类推 d1.isoformat() 返回格式如’YYYY-MM-DD’的字符串 d1.strftime(fmt) 和 time 模块 forma t相同 
具体可见如下示例: 示例 1:我们将 day 参数指定为 1。   
now =  date. today( )  
now 
print ( now. replace( day= 1 ) ) 
  
 
date. today( ) . replace( day= 1 ) 
  
 
now 
  
示例 4:直接使用 now.isoformat() 函数生成 YYYY-MM-DD 格式的当前日期。   
now. isoformat( )  
  
示例 5:直接使用 now.isoweekday() 函数生成周几,返回对应的数字。   
now. isoweekday( )  
  
示例 6:使用 now.strftime() 函数自定义输出格式。   
now. strftime( '%Y.%m.%d' )  
  
 
now =  date( 2021 ,  10 ,  26 )  
print ( now. year, now. month, now. day)  
tomorrow =  now. replace( day =  1 )  
print ( 'now:' ,  now,  ', 当月第一天:' ,  tomorrow)  
print ( 'timetuple():' ,  now. timetuple( ) )   
print ( 'weekday():' ,  now. weekday( ) )  
print ( 'isoweekday():' ,  now. isoweekday( ) )  
print ( 'isoformat():' ,  now. isoformat( ) )  
print ( 'strftime():' ,  now. strftime( "%Y.%m.%d" ) )  
  
 3. datetime 类  
datetime 相当于 date 和 time 结合起来。 其语法模板如下:   
datetime. datetime ( year,  month,  day[  ,  hour[  ,  minute[  ,  second[  ,  microsecond[  ,  tzinfo]  ]  ]  ]  ]  ) 
  
datetime.today():返回一个表示当前本地时间的 datetime 对象。 datetime.now([tz]):返回一个表示当前本地时间的 datetime 对象,如果提供了参数 tz,则获取 tz 参数所指时区的本地时间。 datetime.fromtimestamp(timestamp[, tz]):根据时间戮创建一个 datetime 对象,参数 tz 指定时区信息。 datetime.strptime(date_string, format):将格式字符串转换为 datetime 对象。 我们可以将 datetime 转化为指定格式的字符串。   
from   datetime import  datetime 
now =  datetime. now( )  
print ( type ( now) ) 
print ( now. strftime( '%Y-%m-%d %X' ) ) 
print ( now. strftime( '%Y-%m-%d %H:%M' ) ) 
  
对于 2021-11-25 10:23 这类的字符串,我们可以使用 strptime 将其转化为 datetime。 需要注意的是,将字符串转化为 datetime 数据类型,格式需要统一。   
my_str =  '2021-11-10 10:23'  
print ( datetime. strptime( my_str, '%Y-%m-%d %H:%M' ) ) 
my_str =  '10/11/2021 10:23'  
datetime. strptime( my_str, '%d/%m/%Y %H:%M' ) 
  
 
from   datetime import  *  
import  time 
now =  datetime. now( )  
print ( 'today():' ,  datetime. today( ) )  
print ( 'now():' ,  datetime. now( ) )  
print ( 'fromtimestamp(tmstmp):' ,  datetime. fromtimestamp( time. time( ) ) )     
print ( 'datetime.strptime(date_string, format):' , datetime. strptime( '2022-03-21' ,  "%Y-%m-%d" ) )   
  
 三、timedelta 类的时间加减  
使用 timedelta 可以很方便的在日期上做天 days,小时 hour,分钟 minute,秒 second,毫秒 millisecond,微秒 microsecond 的时间计算,如果要计算月份则需要另外的办法。 具体可见如下示例。 示例 1(加上 -1 和减 1 是相同的):   
from   datetime import  datetime 
from   datetime import  timedelta 
dt =  datetime. now( )  
dt_1 =  dt +  timedelta( days= - 1 )    
dt_11 =  dt -  timedelta( days= 1 )    
dt3 =  dt +  timedelta( days= 1 )    
print ( "dt3:" , dt_1)   
print ( "dt_11:" , dt_11)   
print ( "dt3:" , dt3) 
  
示例 2(可以使用 s.total_seconds 返回在该时间实例的给定持续时间内覆盖的总秒数 ):   
s=  dt3 -  dt_1 
print ( s. days)  
print ( s. total_seconds( ) ) 
  
 
delta_obj =  dt3- dt 
print ( type ( delta_obj) , delta_obj) 
print ( delta_obj. days , delta_obj. total_seconds( ) ) 
  
 四、时间处理基础  
Pandas 提供了四种类型的生成日期时间的对象:日期时间、时间增量、时间跨度、日期偏移量。 (1) 日期时间(Date Times):具有时区支持的特定日期和时间。与 Python 标准库中的 datetime.datetime 类似。如 2020 年 12 月 6 日 13 点 37 分 50 秒. (2) 时间增量(Time Deltas):绝对持续时间,用于在指定时间点基础上增加指定的增量,如在某年月日的基础上增加 2 天、增加 2 个月、减少 4 小时等,最后产生一个新的时间点。 (3) 时间跨度(Time Span):由时间点及其相关周期定义的时间跨度,如连续产生一年四个季度的时间序列。 (4) 日期偏移(Date Offsets):以日历计算的相对持续时间,表示时间间隔,两个时间点之间的长度,如日、周、月、季度、年。   
概念 标量类 数组类 Pandas 数据类型 主要建立方法 日期时间(Date Times) Timesstamp 时间戳 DatetimeIndex 时间索引 datetime64[ns]、datetime64[ns,tz] to datetime()、date_range() 时间增量(Time Deltas) Timedelta 时间增量 Timedeltalndex 时间增量索引 timedelta[ns] to timedelta()、timedelta range() 时间跨度(Time Span) Period 时间周期 PeriodIndex 周期索引 period[freq] Period()、period_range() 日期偏移(Date Offsets) DateOffset None None DateOffset() 
一般情况下,时间序列主要是 Series 或 DataFrame 的时间型索引,可以用时间元素进行操控。