Python 时间相关处理

datetime

        from datetime import datetime, timedelta, date

        fmt:指定日期字符串的格式,其中%Y表示四位年份,%m表示两位月份,%d表示两位日

 

        将日期字符串转为日期对象

                datetime.striptime(date_str,fmt)

date_str = "2022-01-01"
date_obj = datetime.strptime(date_str, "%Y-%m-%d")
print(date_obj)# 输出:2022-01-01 00:00:00

        将日期对象转为字符串

                datetime.striptime(fmt)

date_obj = datetime(2022, 1, 1)
date_str = date_obj.strftime("%Y-%m-%d")
print(date_str)# 输出:2022-01-01

        timedelta

                timedelta是datetime模块中的一个类,用于表示时间间隔(即时间差)。它可以用来进行时间的加减运算,并且可以表示不同单位的时间差,如天、小时、分钟。常用于对天的处理,例如前一天、后一天等。

timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

                天的间隔

from datetime import datetime, timedelta, datedelta = timedelta(days=1)
print(delta)# 输出: 1 day, 0:00:00date_obj = datetime(2022, 1, 1)
previous_day = date_obj - timedelta(days=1)
next_day = date_obj + timedelta(days=1)
print(previous_day)
print(next_day)# 输出:
# 2021-12-31 00:00:00
# 2022-01-02 00:00:00

relativedelta

        relativedelta是dateutil库中的一个类,用于计算两个日期之间的差距,并且可以实现灵活的日期运算。relativedelta相比timedelta更为灵活,可以实现更复杂的日期运算,如计算两个日期之间的年数、月数、星期数等

        dateutil属于第三方库,需要安装后才能使用。

from dateutil.relativedelta import relativedeltarelativedelta(years=0, months=0, days=0, weeks=0, hours=0, minutes=0, seconds=0, microseconds=0)

        月的间隔

date_obj = datetime(2022, 1, 1)
previous_month = date_obj - relativedelta(months=1)
next_month = date_obj + relativedelta(months=1)
print(previous_month)
print(next_month)# 输出
# 2021-12-01 00:00:00
# 2022-02-01 00:00:00

其他功能

        博主也总结了自己常用的几个功能,封装成了函数,供大家参考使用

        分别是三个功能:拆分年月日时分秒、拆分年月日、获取两个时间间隔的日期列表

from datetime import datetime, timedeltafrom ProjectStart.set_logger import USE_LOGGER# 拆分为年月日 与 时分秒
def handle_date_and_time(start_time, end_time, fmt='%Y-%m-%d %H:%M:%S'):"""将传入的开始和结束时间,转为字符串拆分成【年月日】 与 【时分秒】:param start_time: 开始日期:param end_time: 结束日期:param fmt: 对应的日期格式:return: 返回拆分后的值"""data_dict = {'data': "", "warning_info": "", "error_info": "", }try:# 获取拆分后的时间格式if isinstance(start_time, str) and isinstance(end_time, str):start_date_str = start_time.split(" ")[0]start_time_str = start_time.split(" ")[-1]end_date_str = end_time.split(" ")[0]end_time_str = end_time.split(" ")[-1]elif isinstance(start_time, datetime) and isinstance(end_time, datetime):try:start_date_str = datetime.strftime(start_time, fmt).split(" ")[0]start_time_str = datetime.strftime(start_time, fmt).split(" ")[-1]end_date_str = datetime.strftime(end_time, fmt).split(" ")[0]end_time_str = datetime.strftime(end_time, fmt).split(" ")[-1]except ValueError:data_dict["error_info"] = "日期类型格式转换失败"return data_dictelse:data_dict["error_info"] = "数据类型不一致"return data_dictdata_dict["data"] = start_date_str, start_time_str, end_date_str, end_time_strexcept Exception as e:USE_LOGGER.exception(e)finally:return data_dict# 拆分日 日期
def split_day_time(start_time, end_time, whole_fmt='%Y-%m-%d %H:%M:%S', date_fmt='%Y-%m-%d', split_day=1):"""按照指定拆分的日间隔,拆分为列表:param start_time: 开始日期:param end_time: 结束日期:param whole_fmt: 对应的整个日期格式:param date_fmt: 对应日的日期格式:param split_day: 拆分的间隔:return: 返回嵌套列表,每一个子列表为固定时间间隔的值"""data_dict = {'data': "", "warning_info": "", "error_info": "", }ever_date_list = []handle_result_dict = handle_date_and_time(start_time, end_time, fmt=whole_fmt)if handle_result_dict["error_info"]: returnstart_date_str, start_time_str, end_date_str, end_time_str = handle_result_dict["data"]if start_date_str == start_time_str or end_date_str == end_time_str:start_time_str = ""end_time_str = ""try:ever_date = datetime.strptime(start_date_str, date_fmt).date()end_date = datetime.strptime(end_date_str, date_fmt).date()if ever_date == end_date:ever_date_list.append([f"{ever_date} {start_time_str}" if start_time_str else f"{ever_date}",f"{ever_date} {end_time_str}" if end_time_str else f"{ever_date}"])else:while ever_date < end_date:new_start_date = f"{ever_date} {start_time_str}" if start_time_str else f"{ever_date}"ever_date += timedelta(days=split_day)ever_date = ever_datenew_end_date = f"{ever_date} {end_time_str}" if end_time_str else f"{ever_date}"ever_date_list.append([new_start_date, new_end_date])data_dict["data"] = ever_date_listexcept ValueError:data_dict["error_info"] = "日期类型格式转换失败"return data_dictfinally:return data_dict# 获取每一天时间列表
def get_day_date_list(start_time, end_time, whole_fmt='%Y-%m-%d', date_fmt='%Y-%m-%d', out_fmt='%Y-%m-%d'):data_dict = {'data': "", "warning_info": "", "error_info": "", }day_date_list = []handle_result_dict = handle_date_and_time(start_time, end_time, fmt=whole_fmt)if handle_result_dict["error_info"]: returntry:start_date_str, start_time_str, end_date_str, end_time_str = handle_result_dict["data"]start_date = datetime.strptime(start_date_str, date_fmt).date()end_date = datetime.strptime(end_date_str, date_fmt).date()delta = end_date - start_date# 生成每一天的日期并添加到列表中for i in range(delta.days + 1):date = start_date + timedelta(days=i)day_date_list.append(date.strftime(out_fmt))data_dict["data"] = day_date_listexcept ValueError:data_dict["error_info"] = "日期类型格式转换失败"return data_dictfinally:return data_dictif __name__ == '__main__':# s_time = "2024-01-09 00:00:00"# e_time = "2024-01-12 00:00:00"# w_fmt = '%Y-%m-%d %H:%M:%S'# d_fmt = '%Y-%m-%d's_time = "2024-01-09"e_time = "2024-01-20"w_fmt = '%Y-%m-%d'd_fmt = '%Y-%m-%d'result = split_day_time(s_time, e_time, w_fmt, d_fmt)print(result)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/625235.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创建React步骤

确保电脑已经安装了node.js以后&#xff0c;打开终端进入目标文件夹 cd xxx(文件夹 npx create-react-app react01(替换为你自己的react名称) 可能会出现是否安装xxx,输入y即可 没有报错信息后&#xff0c;输入 cd react01 npm start 会自动跳转到react界面&#xff0c;就…

翻译: Streamlit从入门到精通 部署一个机器学习应用程序 四

Streamlit从入门到精通 系列&#xff1a; 翻译: Streamlit从入门到精通 基础控件 一翻译: Streamlit从入门到精通 显示图表Graphs 地图Map 主题Themes 二翻译: Streamlit从入门到精通 构建一个机器学习应用程序 三 1. 5. 如何部署一个Streamlit应用 部署是将应用程序从开发…

把字符串转换成整数(acwing)

把字符串转换成整数 请你写一个函数 StrToInt&#xff0c;实现把字符串转换成整数这个功能。 当然&#xff0c;不能使用 atoi 或者其他类似的库函数。 数据范围 输入字符串长度 [0,20]。 样例 输入&#xff1a;“123” 输出&#xff1a;123 注意: 你的函数应满足下列条件&…

Linux操作系统——重定向与缓冲区

1.理解一下struct file内核对象 上一篇文章&#xff08;文件详解&#xff09;我们一直在谈&#xff0c;一个文件要被访问就必须要先被打开&#xff0c;打开之前就必须要先把文件加载到内存&#xff0c;同时呢我们的操作系统为了管理文件也会为我们的文件创建相对应的struct fi…

数据库多表查询练习题

二、多表查询 1. 创建 student 和 score 表 CREATE TABLE student ( id INT ( 10 ) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR ( 20 ) NOT NULL , sex VARCHAR ( 4 ) , birth YEAR , department VARCHAR ( 20 ) , address VARCHAR ( 50 ) ); 创建 s…

Qt6入门教程 6:Qt元对象系统

目录 一.什么是Qt元对象系统&#xff1f; 二.编译时Qt Creator偷摸做了哪些事情&#xff1f; 1.uic 2.rcc 3.moc 一.什么是Qt元对象系统&#xff1f; Qt中的元对象系统&#xff08;Meta-Object System&#xff09;提供了对象间通信的信号和槽机制、运行时类型信息和动态属…

uniCloud + uView 上传图片,删除图片(含u-upload 组件的使用)

上传图片 <u-upload imageModeaspectFit height"250" :maxCount1 :fileList"fileList" afterRead"uploadOK" delete"delPic"> </u-upload>::v-deep .u-upload__button {width: 100% !important; }::v-deep .u-upload__wra…

基于JAVA+SSM框架开发的志愿者服务管理系统设计与实现【附源码】

&#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 &#x1f4dd; &#x1f680;&#x1f680;&#x1f6…

RK3568笔记九: DRM显示摄像头

若该文为原创文章&#xff0c;转载请注明原文出处。 一、介绍 学习DRM的目的是想做类似NVR显示多路实时流&#xff0c;通过勇哥&#xff08;Marc)的指导&#xff0c;大概流程是通过Zlmedia拉流&#xff0c;RK3568的MPP解码,DRM显示&#xff0c;可以使用HDMI或DIS屏幕&#xf…

ssm+vue的物流配送人员车辆调度管理系统的设计与实现(有报告)。Javaee项目,ssm vue前后端分离项项目。

演示视频&#xff1a; ssmvue的物流配送人员车辆调度管理系统的设计与实现&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&…

【C++干货铺】会旋转的二叉树——AVLTree

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 前言 AVL树 AVL树的概念 AVL树结点的定义 AVL树的插入 寻找插入结点的位置 修改平衡因子 AVL树的旋转 右单旋 左单旋 先右旋再左旋 先左旋再右旋 AVL树…

Kubernetes (十三) 存储——持久卷-动静态分配

一. 简介 二. NFS持久化存储步骤&#xff08;静态分配&#xff09; 1. 集群外…

数字信号处理教程学习笔记1-第2章时域中的离散信号和系统

信号处理的任务示意方框图 模拟信号和数字信号分别是啥样的,有啥区别

freetos day1

作业&#xff1a;使用计数型信号量设计&#xff1a;生产者和消费者模型 总结今天学习的API函数&#xff0c;写出函数参数和返回值的意思&#xff0c;并且说明函数功能 1 2 3

如何结合主从复制,不停服情况下解决分库分表

首先我们要知道主从复制和分库分表两个概念&#xff0c;在此基础上可以将问题分为几个阶段来执行&#xff0c;参考了公众号 双写读老 双写双读 写新读新

PHP反序列化漏洞原理

1、原理: 序列化与反序列化是保证数据一致性的过程。 2、产生: 序列化与反序列化的过程中,用户可控 如果反序列化的参数受到攻击者的控制,就会产生漏洞。攻击者可以通过修改参数个数等方式来控制反序列化过程,从而导致代码执行、SQL注入、目录遍历等不可控后果。如果在反…

2024年1月15日Arxiv最热论文推荐:斯坦福LLM精准微调新框架、GPT不愿承认回答错误、速度快15倍的3D全景分割新突破

本文整理了今日发表在ArXiv上的AI论文中最热门的TOP5。 论文解读、论文热度排序、论文标签、中文标题、推荐理由和论文摘要均由赛博马良平台上的智能体 「AI论文解读达人」提供。 如需查看其他热门论文&#xff0c;欢迎移步赛博马良 ^_^ TOP1 APAR: LLMs Can Do Auto-Paral…

【ARM 嵌入式 编译系列 7.3 -- GCC 链接脚本中 NOLOAD 和 GROUP 的详细介绍】

文章目录 NOLOAD 和 GROUP 的详细介绍NOLOAD 关键字GROUP 关键字实际应用案例 NOLOAD 和 GROUP 的详细介绍 在使用 arm-none-eabi-gcc 工具链中的链接器脚本时&#xff0c;链接脚本使用链接器命令语言来描述如何生成最终的可执行文件。其中&#xff0c;noload 和 group 是两个…

WEB 3D技术 three.js 3D贺卡(1) 搭建基本项目环境

好 今天 我也是在网上学的 带着大家一起来做个3D贺卡 首先 我们要创建一个vue3的项目、 先创建一个文件夹 装我们的项目 终端执行 vue create 项目名称 例如 我的名字想叫 greetingCards 就是 vue create greetingcards因为这个名录 里面是全部都小写的 然后 下面选择 vue3 …

代码随想录算法训练营Day21| 93.复原IP地址、78.子集、90.子集||

LeetCode 93 复原 IP 地址 本题思路&#xff1a;最重要的是想到一个收集结果的条件&#xff0c;也就是终止条件。 当 . 的个数达到三个时候&#xff0c;并且&#xff0c;判断最后剩余的是否符合要求&#xff0c;如果符合&#xff0c;说明整个ip地址可以&#xff0c;就加入到结…