【Python】计算一年内的总天数(还有跨年日期)

花了一段时间才找到Python中求一年中总日数(total day of the Year)的格式代码,所以也把计算方法记录下来。

基本

首先,简单地找出一年中的总天数,

strftime() 和 strptime() 的格式代码是 %j

↓看这里
使用 strftime(‘%j’) 进行转换会返回用零填充的 3 位总天数。
然后可以用int()来转为数值。

import datetime

def calc():

    day = datetime.date(2023, 4, 1)
    total_day = day.strftime('%j')

    print(f'2023/04/01的总天数 = {total_day}')

    total_int = int(total_day)
    print(f'用 int 处理 : {total_int}')

if __name__ == '__main__':
    calc()
$ python test1.py
2023/04/01的总天数 = 091int 处理 : 91

闰年

改一下年份,看看闰年的总天数。

import datetime

def calc():

    day = datetime.date(2020, 4, 1)
    total_day = day.strftime('%j')

    print(f'2020/04/01的总天数 = {total_day}')

if __name__ == '__main__':
    calc()
$ python test2.py
2020/04/01的总天数 = 092

2023/04/01 的总天数为 91 天,因此可以看到闰年中的 2/29 也已正确添加。

处理跨年的总天数

对于那些在年份中使用 366 (367) ,或更大的值,或在处理从年底到年初的总天数时,将上一年年底的值设为负数,将明年一月的值设置为 366 或更高的情况

基本上,只需要在下一年的总天数上加上365,但是需要考虑到上一年是否是闰年,所以需要加上上一年12月31日的总天数(365或 366)。

import datetime

def calc(year):

    next_year = year + 1  # 定义明年

    day = datetime.date(year, 12, 1)  # 前年12/1
    additional_day = datetime.date(year, 12, 31)  # 追加的12/31
    spanning_year = datetime.date(next_year, 1, 3)  # 想要跨年计算的天数

    total_day = day.strftime('%j')
    additional_total_day = int(additional_day.strftime('%j'))
    next_year_total_day = int(spanning_year.strftime('%j'))
    sppaning_total_day = additional_total_day + next_year_total_day

    print(f'{year}/12/01的总天数 = {total_day}')
    print(f'{year}/12/31的总天数 = {additional_total_day}')
    print(f'{next_year}/01/03的总天数 = {sppaning_total_day}')

if __name__ == '__main__':
    print('======== 平年 ========')
    calc(2022)
    print('====== 闰年考虑 ======')
    calc(2020)
$ python test_spanning_year1.py
======== 平年 ========
2022/12/01的总天数 = 335
2022/12/31的总天数 = 365
2023/01/03的总天数 = 368
====== 闰年考虑 ======
2020/12/01的总天数 = 336
2020/12/31的总天数 = 366
2021/01/03的总天数 = 369

可以看到已经考虑了 2020 年的闰年,并添加了额外的一天。

让上一年的 12 月成为负值

最后的计算有点复杂。
首先,由于它可以取负值,需要决定在哪里放置零。
如果忽略零并且不关心 1/1 是否是第一天,上一年的 12/31 是否是 -1 天,那很好,但是当编写时,1 天的差异看起来像差了2天。我认为可能会出现一些不便。

这次我想用负数来表达过去的一年,所以
・上年的12月31日为-1日。
・1/1 是第 0 天
・1 月 1 日之后的总天数为(正常总天数 - 1)天。
按这样来计算.

如果要将上一年表示为负数,基本上可以用(总天数 - 365 - 1)来表示,但与上一节中的+365示例一样,需要考虑到以下情况:上年为闰年,计算公式为(总天数- 上年 12/31 总天数 - 1)。

$ python test_spanning_year2.py
======== 平年 ========
2023/01/05的总天数 = 4
2022/12/31的总天数 = 365
2022/12/27的总天数 = -5
====== 闰年考慮 ======
2021/01/05的总天数 = 4
2020/12/31的总天数 = 366
2020/12/27的总天数 = -5

很难判断结果是否正确,所以制作一个假设值表格并检查。
在这两个年份中,1/1 应为 0,12/31 应为 -1,因此正确的总日期如下表所示。在这里插入图片描述与计算结果相符!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于当前实时云渲染的特点,用户体验主要受哪些因素影响?

在回答这个问题之前我们首先需要理解什么是实时云渲染? 点量实时云渲染是一种基于云计算低延迟传输,实现各种轻终端便捷使用云端大型软件和3D应用的一种云技术解决方案。这一技术解决方案通过将应用程序或内容置于云端服务器上运行,然后以视…

测试用例设计方法六脉神剑——第四剑:石破天惊,功能图法攻阵

1 引言 前面几篇文章为我们讲述了因果图、判定表、正交试验等几种方法,主要是针对于不同条件输入输出的组合进行测试,但在实际需求中,我们也常会遇到需要对被测对象的状态流转进行验证的情况,此时前面几种方法将不再适用&#xf…

测试用例设计方法:功能图

1 引言 前面几篇文章为我们讲述了因果图、判定表、正交试验等几种方法,主要是针对于不同条件输入输出的组合进行测试,但在实际需求中,我们也常会遇到需要对被测对象的状态流转进行验证的情况,此时前面几种方法将不再适用&#xf…

OpenHarmony 鸿蒙系统之开发环境安装

一、首先在下方链接网址中下载DevEco Studio的安装包。 DevEco Studio历史版本下载-HarmonyOS应用开发官网

Linux CentOS7 Docker安装Jenkins

1 sudo yum update #确保yum包更新到最新 service network restart #重启网络 2、查询镜像 docker search jenkins 3、拉取镜像 docker pull jenkins/jenkins #拉取镜像 4、创建Jenkins工作目录,并将容器内目录挂载到此目录…

23.12.10日总结

周总结 这周三的晚自习,学姐讲了一下git的合作开发,还有懒加载,防抖,节流 答辩的时候问了几个问题: 为什么在js中0.10.2!0.3? 在js中进行属性运算时,会出现0.10.20.300000000000000004js遵循IEEE754标…

CSS伪元素的特殊机制

概念 伪元素是CSS中的一种特殊机制,用于在元素的特定位置插入虚拟的内容。它们不是实际存在于HTML文档中的元素,而是通过CSS样式来创建和控制的。 伪元素使用双冒号(::)作为标识符,用于区分伪类选择器(使…

Linux Shell——基本语法(变量、流程控制)

shell基本语法 一、变量二、流程控制 总结 最近学习了shell脚本,记录一下相关语法 一、变量 变量是很重要的,是用于存储数据值的容器 变量名要遵循以下规则: (1)只能包含字母、数字和下划线 (2&#xff09…

鸿蒙开发组件之Web

一、加载一个url myWebController: WebviewController new webview.WebviewControllerbuild() {Column() {Web({src: https://www.baidu.com,controller: this.myWebController})}.width(100%).height(100%)} 二、注意点 2.1 不能用Previewer预览 Web这个组件不能使用预览…

Android camera的metadata

一、实现 先看一下metadata内部是什么样子: 可以看出,metadata 内部是一块连续的内存空间。 其内存分布大致可概括为: 区域一 :存 camera_metadata_t 结构体定义,占用内存 96 Byte 区域二 :保留区&#x…

Linux install manual 1Panel

前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。1Panel 的功能和优势包括: 快速建站:深度集成 Wordpress 和 Halo,域名绑定、SSL 证书配置等一键搞定;高效管理:通过 Web 端轻松管理 Linux 服务器,包括主机监控、文件管理、数据库管理、容器管理等;安全可…

Qt图像处理-Qt中配置OpenCV打开本地图片

本文讲解Qt中配置OpenCV过程并用实例展示如何使用OpenCV打开图片(windows环境下) 一、下载OpenCv 本文使用版本OpenCV-MinGW-Build-OpenCV-3.4.5 下载地址: https://codeload.github.com/huihut/OpenCV-MinGW-Build/zip/refs/heads/OpenCV-3.4.5 点击Code-local-Downlo…

大模型的实践应用13-量化后的通义千问Qwen的18亿参数在CPU上的部署,最小2GB显存可跑,并利用两种文本流式方式输出

大家好,我是微学AI,今天给大家介绍大模型的实践应用13-量化后的通义千问Qwen的18亿参数在CPU上的部署,最小2GB显存可跑,并利用两种文本流式方式输出。Qwen-1_8B-Chat是阿里云研发的通义千问大模型系列的18亿参数规模的模型。Qwen-1.8B是基于Transformer的大语言模型, 在超大…

LabVIEW进行癌症预测模型研究

LabVIEW进行癌症预测模型研究 癌症是一种细胞异常增生的疾病。随着年龄的增长,细胞分裂速度放缓,但癌细胞会失去控制地不断分裂,形成可能良性或恶性的肿瘤。 2012年的国际癌症数据显示,新发癌症病例和癌症相关死亡人数有所增加。…

.NET 开发人员,迎接高薪的挑战,你准备好了吗?

我发现我对编程的热情深深植根于我对逻辑的偏好。加入CSDN,标志着进入 .NET 开发人员世界的激动人心的旅程的开始。下面我与您分享我的故事。 编程之路 我大学是主修通信计算机创新,各种各样的选修课程,从平面设计、UX/UI 设计、数字营销到电影&#x…

在Node.js中MongoDB删除数据的方法

本文主要介绍在Node.js中MongoDB删除数据的方法。 目录 Node.js中MongoDB删除数据使用mongodb库删除数据使用Mongoose库删除数据 Node.js中MongoDB删除数据 在Node.js中,可以使用mongodb和Mongoose库来连接和操作MongoDB数据库。 下面是分别使用这两个库在MongoDB中…

双端队列和优先级队列

文章目录 前言dequedeque底层设计迭代器设计 priority仿函数数组中的第k个最大元素优先级队列模拟实现pushpop调整仿函数存储自定义类型 前言 今天要介绍比较特殊的结构,双端队列。 还有一个适配器,优先级队列。 deque 栈的默认容器用了一个deque的东西…

福德机械:植保无人机的领航者

亲爱的读者们,欢迎来到福德机械的神奇世界。在这个充满活力和创新的世界里,我们专注于植保无人机的发展与应用,以实现农业现代化、智能化和高效化的目标。植保无人机,作为一种高效、环保和安全的农业工具,已经逐渐成为…

自动化测试流程详解

最近很多小伙伴问我自动化测试到底该怎么做?流程是什么样的?在每个阶段都需要注意什么?本文也就主要从自动化测试的基本流程入手,对面试自动化测试工程师的同学会有不少帮助。对于在职的朋友,也可以参考此流程&#xf…

速锐得解码适配新能源纯电动汽车比亚迪E3车型CAN矩阵协议

在新能源电动汽车中王牌有特斯拉,王朝有比亚迪。在国内,比亚迪顺风顺水,能见度最高的王朝系列拥有EV、双模以及燃油三种能源类型,攻占着全国不同的市场,性价比高的,属于E系列,早期的E6是整个出租…