python@日期和时间@datetime@relativedelta
创始人
2025-05-31 15:50:14

文章目录

    • python datetime
    • relativedelta
      • demo
    • `timedelta`和`relativedelta`
      • 获取星期几@strftime
    • 日期范围
    • pandas 日期
      • 日期偏移

python datetime

  • datetime — Basic date and time types — Python 3.11.2 documentation

relativedelta

  • relativedelta — dateutil 2.8.2 documentation

    • 这种类型(type)是基于M.-A. Lemburg在他的mx.DateTime扩展中所做工作的规范。然而,需要注意的是,它并不实现与他的工作相同的算法。不要期望它的行为与mx.DateTime的对应物相同。简而言之,虽然两者有共同点,但是它们的具体实现可能会有所不同,因此不能完全等同对待。

    • There are two different ways to build a relativedelta instance. The first one is passing it two date/datetime classes:

      relativedelta(datetime1, datetime2)
      

      The second one is passing it any number of the following keyword arguments:

      relativedelta(arg1=x,arg2=y,arg3=z...)year, month, day, hour, minute, second, microsecond:Absolute information (argument is singular); adding or subtracting arelativedelta with absolute information does not perform an arithmeticoperation, but rather REPLACES the corresponding value in theoriginal datetime with the value(s) in relativedelta.years, months, weeks, days, hours, minutes, seconds, microseconds:Relative information, may be negative (argument is plural); addingor subtracting a relativedelta with relative information performsthe corresponding arithmetic operation on the original datetime valuewith the information in the relativedelta.
    • weekday: One of the weekday instances (MO, TU, etc) available in therelativedelta module. These instances may receive a parameter N,specifying the Nth weekday, which could be positive or negative(like MO(+1) or MO(-2)). Not specifying it is the same as specifying+1. You can also use an integer, where 0=MO. This argument is alwaysrelative e.g. if the calculated date is already Monday, using MO(1)or MO(-1) won't change the day. To effectively make it absolute, useit in combination with the day argument (e.g. day=1, MO(1) for firstMonday of the month).leapdays:Will add given days to the date found, if year is a leapyear, and the date found is post 28 of february.yearday, nlyearday:Set the yearday or the non-leap year day (jump leap days).These are converted to day/month/leapdays information.
      

demo

from datetime import date
from dateutil.relativedelta import relativedeltad = date(2023, 3, 20)
# 下周2
rd0=relativedelta(weekday=TU)
# weekday 配合 day参数,指定本月的第几个周2
rd1 = relativedelta(weekday=TU, day=1)
# 指定本月的第2个周2
rd2=relativedelta(weekday=TU(2), day=1)
# days参数和weekday参数同时设置时,产生叠加效果
#叠加过大,可能会跑到下个月或更大的月份
rd3=relativedelta(weekday=TU,days=2)
rd4=relativedelta(weekday=TU(2),days=1)
rd5=relativedelta(weekday=TU(3),days=1)
# 效果和rd1一样,当weekday和day同时设置,取决于TU()
rd6=relativedelta(weekday=TU(1),day=2)
rd7=relativedelta(weekday=TU(1),weeks=1)
d0=d+rd0
d1=d+rd1
d2=d+rd2
d3=d+rd3
d4=d+rd4
d5=d+rd5
d6=d+rd6
d7=d+rd7
print(f'{d0=}',d0.strftime('%A'))
print(f'{d1=}',d1.strftime('%A'))  
print(f'{d2=}')
print(f'{d3=}')
print(f'{d4=}')
print(f'{d5=}')
print(f'{d6=}')
print(f'{d7=}')
  • d0=datetime.date(2023, 3, 21) Tuesday
    d1=datetime.date(2023, 3, 7) Tuesday
    d2=datetime.date(2023, 3, 14)
    d3=datetime.date(2023, 3, 28)
    d4=datetime.date(2023, 3, 28)
    d5=datetime.date(2023, 4, 4)
    d6=datetime.date(2023, 3, 7)
    d7=datetime.date(2023, 3, 28)
    
  • matplotlib.dates — Matplotlib 3.7.1 documentation

timedeltarelativedelta

  • timedeltarelativedelta都是Python标准库datetime模块中用于处理日期和时间差异的类,它们的作用略有不同:

    1. timedelta用于表示一个时间段(时分秒毫秒),可以把它加到某个日期或时间上,得到另一个日期或时间。例如:

      from datetime import datetime, timedeltadt = datetime(2023, 3, 20, 12, 0, 0)
      td = timedelta(days=7)new_dt = dt + td
      print(new_dt)   # 2023-03-27 12:00:00
      

      上面的代码中,我们创建了一个datetime对象,表示2023年3月20日12点整。然后,我们创建了一个timedelta对象,表示7天时间差异。最后,通过将时间差异加到原来的日期上,得到了新的日期:2023年3月27日12点。

    2. relativedelta用于表示日期之间的差异,并且可以处理更复杂的调整规则,例如“下个月的最后一天”、“下一个星期五”等。例如:

      from datetime import date
      from dateutil.relativedelta import relativedeltad = date(2023, 3, 20)
      rd = relativedelta(d, months=1, day=31)new_d = d + rd
      print(new_d)   # 2023-04-30
      
      • 上面的代码中,我们创建了一个date对象,表示2023年3月20日。
      • 然后,我们创建了一个relativedelta对象,表示将日期调整到下个月的最后一天。
      • 最后,通过将日期调整应用到原来的日期上,得到了新的日期:2023年4月30日。

    因此,timedeltarelativedelta都是非常有用的类,可用于在Python中执行日期和时间计算。但是,它们的使用场景略有不同,需要根据具体情况进行选择。

获取星期几@strftime

  • strftime-and-strptime-format-codes|datetime — Basic date and time types — Python 3.11.2 documentation

  • from datetime import datetimetoday = datetime.now().strftime('%A')
    print("今天是周几:", today)
    print("当前时间:", now)
    

日期范围

  • numpy日期

    xdates = np.arange(np.datetime64('2021-11-15'), np.datetime64('2021-12-25'),np.timedelta64(1, 'h'))
    
  • pandas日期返回

    dates = pd.date_range("20130101", periods=6)
    

pandas 日期

  • pandas.date_range — pandas 1.5.3 documentation (pydata.org)
    • 返回一个固定频率的DatetimeIndex。
    • 该函数返回一组等间隔的时间点,这些时间点之间的差距由给定的频率freq指定,使得它们都满足 start <= x <= end 的条件,其中第一个和最后一个时间点分别是该范围内落在 freq 边界上的第一个和最后一个时间点(如果 freq 以频率字符串的形式给出),或者是对于 freq 有效的第一个和最后一个时间点(如果 freq 给出为 pandas.tseries.offsets.DateOffset)。
    • (如果 start、end 或 freq 中恰好有一个未指定,则可以通过 periods 计算出该缺失参数,periods 是该范围内时间步数的数量。)

日期偏移

  • pandas.tseries.offsets.DateOffset — pandas 1.5.3 documentation (pydata.org)

  • from pandas.tseries.offsets import DateOffset
    d3=pd.date_range(start='1/10/2018', periods=5, freq='5d')
    # d4=pd.date_range(start='1/10/2018', periods=5, freq=pd.offsets)
    # 创建一个以'2022-01-01'为基准,每隔5天生成的日期范围
    # offset = pd.DateOffset(days=5)
    offset=DateOffset(days=5)
    d4 = pd.date_range(start='2022-01-10', end='2022-01-31', freq=offset)
    offset_M=DateOffset(months=1)
    d5=pd.date_range(start='2022-01-10',periods=5, freq=offset_M)
    print(d3,d4,d5)
    • (DatetimeIndex(['2018-01-10', '2018-01-15', '2018-01-20', '2018-01-25','2018-01-30'],dtype='datetime64[ns]', freq='5D'),DatetimeIndex(['2022-01-10', '2022-01-15', '2022-01-20', '2022-01-25','2022-01-30'],dtype='datetime64[ns]', freq=''),DatetimeIndex(['2022-01-10', '2022-02-10', '2022-03-10', '2022-04-10','2022-05-10'],dtype='datetime64[ns]', freq=''))
      

相关内容

热门资讯

【实验报告】实验一 图像的... 实验目的熟悉Matlab图像运算的基础——矩阵运算;熟悉图像矩阵的显示方法࿰...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
大模型落地比趋势更重要,NLP... 全球很多人都开始相信,以ChatGPT为代表的大模型,将带来一场NLP领...
Linux学习之端口、网络协议... 端口:设备与外界通讯交流的出口 网络协议:   网络协议是指计算机通信网...
kuernetes 资源对象分... 文章目录1. pod 状态1.1 容器启动错误类型1.2 ImagePullBackOff 错误1....
STM32实战项目-数码管 程序实现功能: 1、上电后,数码管间隔50ms计数; 2、...
TM1638和TM1639差异... TM1638和TM1639差异说明 ✨本文不涉及具体的单片机代码驱动内容,值针对芯...
Qt+MySql开发笔记:Qt... 若该文为原创文章,转载请注明原文出处 本文章博客地址:https://h...
Java内存模型中的happe... 第29讲 | Java内存模型中的happen-before是什么? Java 语言...
《扬帆优配》算力概念股大爆发,... 3月22日,9股封单金额超亿元,工业富联、鸿博股份、鹏鼎控股分别为3.0...
CF1763D Valid B... CF1763D Valid Bitonic Permutations 题目大意 拱形排列࿰...
SQL语法 DDL、DML、D... 文章目录1 SQL通用语法2 SQL分类3 DDL 数据定义语言3.1 数据库操作3.2 表操作3....
文心一言 VS ChatGPT... 3月16号,百度正式发布了『文心一言』,这是国内公司第一次发布类Chat...
CentOS8提高篇5:磁盘分...        首先需要在虚拟机中模拟添加一块新的硬盘设备,然后进行分区、格式化、挂载等...
Linux防火墙——SNAT、... 目录 NAT 一、SNAT策略及作用 1、概述 SNAT应用环境 SNAT原理 SNAT转换前提条...
部署+使用集群的算力跑CPU密... 我先在开头做一个总结,表达我最终要做的事情和最终环境是如何的,然后我会一...
Uploadifive 批量文... Uploadifive 批量文件上传_uploadifive 多个上传按钮_asing1elife的...
C++入门语法基础 文章目录:1. 什么是C++2. 命名空间2.1 域的概念2.2 命名...
2023年全国DAMA-CDG... DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义...
php实现助记词转TRX,ET... TRX助记词转地址网上都是Java,js或其他语言开发的示例,一个简单的...
【分割数据集操作集锦】毕设记录 1. 按要求将CSV文件转成json文件 有时候一些网络模型的源码会有data.json这样的文件里...
Postman接口测试之断言 如果你看文字部分还是不太理解的话,可以看看这个视频,详细介绍postma...
前端学习第三阶段-第4章 jQ... 4-1 jQuery介绍及常用API导读 01-jQuery入门导读 02-JavaScri...
4、linux初级——Linu... 目录 一、用CRT连接开发板 1、安装CRT调试工具 2、连接开发板 3、开机后ctrl+c...
Urban Radiance ... Urban Radiance Fields:城市辐射场 摘要:这项工作的目标是根据扫描...
天干地支(Java) 题目描述 古代中国使用天干地支来记录当前的年份。 天干一共有十个,分别为:...
SpringBoot雪花ID长... Long类型精度丢失 最近项目中使用雪花ID作为主键,雪花ID是19位Long类型数...
对JSP文件的理解 JSP是java程序。(JSP本质还是一个Servlet) JSP是&#...
【03173】2021年4月高... 一、单向填空题1、大量应用软件开发工具,开始于A、20世纪70年代B、20世纪 80年...
LeetCode5.最长回文子... 目录题目链接题目分析解题思路暴力中心向两边拓展搜索 题目链接 链接 题目分析 简单来说࿰...