Python中的Pandas 时间函数 time 、datetime 模块和时间处理基础讲解

作者:虚心求知的熊 时间:2022-08-01 05:18:41 

Python 中提供了对时间日期的多种多样的处理方式,主要是在 time 和 datetime 这两个模块里。

一、time 模块

  • time 模块不牵扯时区的问题,便于计算。

  • (1) timestamp 时间戳,时间戳表示的是从 1970 年 1 月 1 日 00:00:00 开始按秒计算的偏移量。

  • (2) struct_time 时间元组,共有九个元素组。

  • (3) format time 格式化时间,已格式化的结构使时间更具可读性。包括自定义格式和固定格式。

1、时间格式转换图

Python中的Pandas 时间函数 time 、datetime 模块和时间处理基础讲解

  • 主要 time 生成方法和 time 格式转换方法实例如下:

  • 首先,我们导入 time 模块,便于我们后续的操作。

import time

然后,我们生成 timestamp ,他是一个浮点型数据。

time.time()
#1676978808.2162082

将其转化为整型数据。

int(time.time())
#1676978809

我们可以知道一个程序消耗的时间,通过设置程序开始时间和程序结束时间,中间执行一个循环语句,这里以累加到 10000 为例。

start_time = time.time()
s = ""
for i in range(10000):    
s += str(i)  
end_time = time.time()  
print("程序消耗时间=",end_time-start_time)
#程序消耗时间= 0.0039615631103515625

我们也可以通过 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)
#time.struct_time(tm_year=2023, tm_mon=2, tm_mday=21, tm_hour=19, tm_min=26, tm_sec=58, #tm_wday=1, tm_yday=52, tm_isdst=0)
#2023
#2
#21

我们可以将 timsstamp 转化为 struct_time。

time.localtime(1650177058)
#time.struct_time(tm_year=2022, tm_mon=4, tm_mday=17, tm_hour=14, tm_min=30, tm_sec=58, #tm_wday=6, tm_yday=107, tm_isdst=0)

可以将格式化字符串输入到 struct_time。

time.strptime('2011-05-05 16:37:06', '%Y-%m-%d %X')
#time.struct_time(tm_year=2011, tm_mon=5, tm_mday=5, tm_hour=16, tm_min=37, tm_sec=6, #tm_wday=3, tm_yday=125, tm_isdst=-1)

我们也可以将格式化字符串时间反向转变为秒钟数。

time.mktime(time.strptime('2011-05-05 16:37:06', '%Y-%m-%d %X'))
#1304584626.0
  • 我们可以生成 format_time,产生满足我们格式要求的时间。

  • 示例 1:

#struct_time to format_time time.strftime("%Y-%m-%d %X")
time.strftime("%Y-%m-%d %X",time.localtime())
#time.strftime("%Y-%m-%d %X",time.localtime())
#'2023-02-21 19:27:05' #生成format_time

示例 2:

#struct_time to format_time
time.strftime("%Y-%m-%d")
#time.strftime("%Y-%m-%d %X",time.localtime())
#'2023-02-21'

示例 3:

#struct_time to format_time
time.strftime("%m-%d-%Y")
#time.strftime("%Y-%m-%d %X",time.localtime())
#'02-21-2023'

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}工作"
#2011
#5
#7
#16
#37
#'我们在家里工作'

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)
  • 常见的结构化时间组合有如下几种:

  • 示例 1:

time.strftime("%Y-%m-%d %X")
#'2023-02-21 20:55:40'

time.strftime("%Y-%m-%d %X")
#'2023-02-21 20:55:40'

示例 2:

time.strftime("%Y-%m-%d")
#'2023-02-21'

示例 3:

time.strftime("%m")
#'02'

我们可以通过 time 运算获取我们想要的时间点,并按 %Y-%m-%d %X 的形式表达出来。

import time
t1 = time.time()
t2=t1+24*60*60  
time.strftime("%Y-%m-%d %X",time.localtime(t2))
#'2023-02-22 21:02:38'

或者通过 time 进行暂停操作,例如火箭发射,我们在循环结束后暂停 1s,然后进行下一个语句。

# 倒计时
for i in range(5):
    print('\r',' %s 秒!' % (5-i), end='')
    # 暂停1s后运行    
    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()))
#date.today(): 2023-02-21
#date.fromtimestamp(): 2023-02-21

示例 2:

from datetime import date
print(type(date.fromtimestamp(1650177058)))
print(date.fromtimestamp(1650177058))
#<class 'datetime.date'>
#2022-04-17

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()返回格式如&rsquo;YYYY-MM-DD&rsquo;的字符串
d1.strftime(fmt)和 time 模块 forma t相同
  • 具体可见如下示例:

  • 示例 1:我们将 day 参数指定为 1。

now = date.today()
now
print(now.replace(day=1))
#2023-02-01

示例 2:同示例 1,但是换了一种函数写法。

date.today().replace(day=1)
#datetime.date(2023, 2, 1)

示例 3:直接使用 now 函数生成当前日期。

now
#datetime.date(2023, 2, 21)

示例 4:直接使用 now.isoformat() 函数生成 YYYY-MM-DD 格式的当前日期。

now.isoformat()
#'2023-02-21'

示例 5:直接使用 now.isoweekday() 函数生成周几,返回对应的数字。

now.isoweekday()
#2

示例 6:使用 now.strftime() 函数自定义输出格式。

#'2022.04.18'  自定义输出格式
now.strftime('%Y.%m.%d')
#'2023.02.21'

示例 7:

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"))
#2021 10 26
#now: 2021-10-26 , 当月第一天: 2021-10-01
#timetuple(): time.struct_time(tm_year=2021, tm_mon=10, tm_mday=26, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=1, tm_yday=299, tm_isdst=-1)
#weekday(): 1
#isoweekday(): 2
#isoformat(): 2021-10-26
#strftime(): 2021.10.26

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'))
#<class 'datetime.datetime'>
#2023-02-21 21:45:25
#2023-02-21 21:45
  • 对于 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')
#2021-11-10 10:23:00
#datetime.datetime(2021, 11, 10, 10, 23)

汇总一下,见下方例子。

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"))  
#today(): 2023-02-21 21:45:28.141748
#now(): 2023-02-21 21:45:28.141748
#fromtimestamp(tmstmp): 2023-02-21 21:45:28.141748
#datetime.strptime(date_string, format): 2022-03-21 00:00:00

三、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)
#dt3: 2023-02-20 22:11:28.388926
#dt_11: 2023-02-20 22:11:28.388926
#dt3: 2023-02-22 22:11:28.388926

示例 2(可以使用 s.total_seconds 返回在该时间实例的给定持续时间内覆盖的总秒数 ):

# 明天的datetime  - 昨天的datetime
s= dt3 - dt_1
print(s.days)
print(s.total_seconds())
#2
#172800.0

示例 3:

delta_obj = dt3-dt
print(type(delta_obj),delta_obj)#<type 'datetime.timedelta'> 1 day, 0:00:00
# total_seconds():返回在该时间实例的给定持续时间内覆盖的总秒数
print(delta_obj.days ,delta_obj.total_seconds())#1 86400.0
#<class 'datetime.timedelta'> 1 day, 0:00:00
#1 86400.0

四、时间处理基础

  • 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&#x#xff09;Period 时间周期PeriodIndex 周期索引period[freq]Period()、period_range()
日期偏移(Date Offsets)DateOffsetNoneNoneDateOffset()
  • 一般情况下,时间序列主要是 Series 或 DataFrame 的时间型索引,可以用时间元素进行操控。

来源:https://blog.csdn.net/weixin_45891612/article/details/129146993

标签:Python,Pandas,时间,函数
0
投稿

猜你喜欢

  • Python中的内置函数isdigit()

    2023-05-16 16:10:31
  • 详解Python解决抓取内容乱码问题(decode和encode解码)

    2021-12-18 09:26:29
  • python 专题九 Mysql数据库编程基础知识

    2024-01-19 23:06:04
  • JavaScript观察者模式(publish/subscribe)原理与实现方法

    2024-04-10 10:44:15
  • 在Python的Django框架中创建语言文件

    2023-05-06 09:54:21
  • vue3中的透传attributes教程示例详解

    2024-05-05 09:22:34
  • python 找出list中最大或者最小几个数的索引方法

    2022-08-12 13:23:11
  • Python 多线程Threading初学教程

    2022-12-17 18:53:43
  • Express实现Session身份认证的示例代码

    2024-05-08 09:38:21
  • python爬虫入门教程--优雅的HTTP库requests(二)

    2022-04-01 05:10:43
  • Python序列化模块JSON与Pickle

    2022-11-06 00:24:37
  • 解决Jupyter因卸载重装导致的问题修复

    2023-09-30 18:22:31
  • Oracle平台应用数据库系统的设计与开发

    2010-07-21 13:03:00
  • python 实现ping测试延迟的两种方法

    2022-03-05 06:35:17
  • 他们是如何不让我的Teleport和Webzip工作的?

    2010-07-14 21:06:00
  • python3字符串操作总结

    2023-08-23 22:31:23
  • Python3的介绍、安装和命令行的认识(推荐)

    2022-10-09 22:45:36
  • Python通用循环的构造方法实例分析

    2022-03-30 00:03:56
  • python二分法查找算法实现方法【递归与非递归】

    2023-04-17 08:13:47
  • Python控制windows系统音量实现实例

    2022-07-29 12:09:46
  • asp之家 网络编程 m.aspxhome.com