Python一些可能用的到的函数系列122 ATimer2

说明

由于时间处理在算网中起到了更重要的作用:不仅是进行时间计算,而是成为架构规范的一部分,因此需要对ATimer进行升级,成为一个基础依赖对象。

内容

1 设计

ATimer的作用更多的是进行即时计算,ATimer2将拓展为基础运行工具,带来的变化:

  • 1 静态参数固化。对象将设定一个固定的静态参数,而不是即时生成。
  • 2 对象化同时微服务化。既是对象,也是微服务。通过GlobalFunc进行统一调用
  • 3 更多周期。按秒、分钟、天、周、月、年构成更完整的偏移周期。

因为太阳历的偏差,导致了需要在闰年补一天,所以没办法进行简单的推算来计算时间。而且每个月还有大小月,规则会比较麻烦。

所以我想先通过推断生成一个基本时间轴,通过基本时间轴可以进行大致的定位,然后再通过推算来处理具体的时间。

所以第一步是生成基本时间轴,第二步是进行时间的对齐与推断。

每个月都有1号。

假设我们获得了每个月1号的时间戳,那么就可以进行时间推断了。生成这样一个字典就屏蔽了平闰年与大小月的差异。

{'1970-01': -28800.0,
 '1970-02': 2649600.0,
 '1970-03': 5068800.0,
 ...

1.1 字符转时间戳

标准时间格式为yy-mm-dd HH:MM:SS,例如 2000-01-01 00:00:00。

只要将年月目标分yymon提取出来,查表就可以得到其月基准时间戳 month_ts,剩下的天、时、分、秒可以按照固定规则映射 day_ts = day * 86400 + hour * 3600 + minute * 60 + seconds
一个合法的日期表达,其时间戳必然小于下一个月的基准时间戳。

当然,这个约束可以在标准时间格式转换时加以确认。

1.2 时间戳转字符

选择比时间戳小的最近一个月基准时间戳,获取年月基准时间戳。然后将当前时间戳与月基准时间戳取差值,这个差值按照固定规则推算出日,时,分,秒。对应的字符则为月基准字符 + 推算字符。

2 开发

从实用的角度出发,时间轴覆盖范围为1970~2970, 这样的范围属于足够用且轴长度不会太长的样子。

2.1 月基准日历

第一步需要推算按天的日历。

既然确定了年份,那么按照平闰年生成千年历。然后以第一天作为基准(可以在这里考虑时区差),按照86400递增获取每一天的时间戳。

然后将1号的部分抽取出来,就形成了月基准时间轴。容易知道这个轴大约是12000的长度,很小的尺寸。在具体计算时,还可以根据要面对的问题临时抽取更小的轴进行计算。

三个入参:基准年、偏移年和时区

生成千年的天列表

base_year = 1970
next_years = 1000
# 千年历的制作
ty_calendar = []
for some_year in list(range(base_year , base_year +next_years)):
    if is_ryear(some_year):
        day_list = b_list 
    else:
        day_list = a_list

    tem_day_list = ['%s-%s' % (some_year, some_day) for some_day in day_list ]
    ty_calendar = ty_calendar + tem_day_list

生成一个frame

# 日表
ty_frame = pd.DataFrame()
ty_frame['date'] = list(ty_s)
ty_frame['day'] = list(range(len(ty_frame)))
ty_frame['seconds'] = ty_frame['day']  * 86400
ty_frame['tz8_seconds'] = ty_frame['seconds']  - 8 * 3600

在这里插入图片描述
筛选后生成年月为基准的表

sel = ty_frame['date'].apply(lambda x: True if x.endswith('-01') else False)
ty_yymon_df = ty_frame[sel]

在这里插入图片描述
得到一个基于年月的有序字典

yymon_dict = cl.OrderedDict(zip(list(ty_yymon_df['date']),list(ty_yymon_df['tz8_seconds'])))

2.2 转换

2.2.1 将字符转为时间戳

# 分离月 + 日:时:分:秒
def depart_mon_ddhhmmss(dt_str):
    pos = dt_str.rfind('-')
    yymon = dt_str[:pos]+'-01'
    ddhhmmss = dt_str[pos+1:]
    return yymon, ddhhmmss

def ddhhmmss2s(dhms_str):
    _d, _hms = dhms_str.split()
    _h,_m,_s = _hms.split(':')
    return 86400*(int(_d)-1) + 3600 *(int(_h)) + 60 *(int(_m)) + int(_s)
# 1 字符转时间戳
some_str = '2023-01-24 17:44:44'
yymon, dhms = depart_mon_ddhhmmss(some_str)
ts = yymon_dict[yymon] + ddhhmmss2s(dhms)
1674553484

在这里插入图片描述

2.2.2 将时间戳转为字符

# 时间戳的轴,长度 12000
time_axis = np.array(list(yymon_dict.values()))
dt_axis = list(yymon_dict.keys())
pos= max(np.where(time_axis <= ts)[0])
base_dt = dt_axis[pos]
base_ts = time_axis[pos]
gap_ts = ts - base_ts

def gapts2day(some_ts):
    _d = some_ts//86400
    _res1 = some_ts % 86400
    _h = _res1 //3600
    _res2 =  _res1 % 3600
    _m = _res2 //60
    _s = _res2 % 60
    return "-{:02d} {:02d}:{:02d}:{:02d}".format( _d + 1,_h,_m,_s)

char_ts = base_dt[:7] + gapts2day(gap_ts)
'2023-01-24 17:44:44'

转换功能是最基础的功能,在大规模时间转换上,应该会有不错的表现,后续可以验证一下。就在时间戳的转换和还原上,用pandas的apply进行简单的函数并行调用进行实验。未来如果效率需要,是可以将要转换的列直接用矩阵方式进行计算的,这样会快很多。

下一个核心功能的就是偏移计算了,偏移计算分为两类:

  • 1 已知某一个时间,需要知道之前或者之后的时间。
  • 2 已知两个时间,需要知道他们之间的差距。

这部分先写到这里吧。

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

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

相关文章

关于软件0X00000007B的问题

对于0x0000007B问题相信大家一定都很头疼,编译好的软件在自己电脑上可以正常运行,更换一台电脑或许就无法正常运行.那么我们改怎么处理呢? 情况一:vs版本不一致导致的打不开软件 1方法一Windows日志查看软件运行失败的原因,一般都是dll版本不兼容引起的无法调用,解决方法 “”…

穿越网络边界:深入了解 FRP 内网穿透机制

前言 在当今互联网时代&#xff0c;内网穿透成为了解决内部网络服务对外难以访问的问题的一种重要方式。Fast Reverse Proxy&#xff08;FRP&#xff09;作为一款强大的反向代理工具&#xff0c;为用户提供了一种高效、灵活的内网穿透解决方案。本文将深入介绍 FRP 的原理和使…

java基础学习: 什么是泛型的类型擦除

文章目录 一、什么是泛型2、泛型编译前和编译后对比3、泛型的优点&#xff08;1&#xff09;提高了代码的复用性和可读性&#xff08;2&#xff09;提高了代码的安全性 二、泛型的定义1、泛型类2、泛型接口3、泛型方法 三、泛型通配符1、&#xff1f;和T有什么区别2、通配符的分…

喝汽水问题(c语言)

喝汽水&#xff0c;1瓶汽水1元&#xff0c;2个空瓶可以换一瓶汽水&#xff0c;给20元&#xff0c;可以喝多少汽水&#xff0c;这里用c语言来解释 可以先用列举法来说明&#xff0c;20可以买20个汽水&#xff0c;两个空瓶换一瓶就可以获得10个汽水&#xff0c;同理10个空瓶个可…

IDEA常用插件(本人常用,不全)

文章目录 一、图标提示类插件1、Lombok插件&#xff08;用户配合lombok依赖的工具&#xff09;2、MybatisX插件3、GitToolBox4、VUE.js5、ESLint 二、代码自动生成插件1、EasyCode插件&#xff1a;自动生成代码神器2、GsonFormat 三、常用工具类1、IDE Eval Reset 插件&#xf…

vector函数介绍与实现(迭代器失效)

目录 一、介绍vector 1.vector是什么 2.vector的特点 1.随机访问 2.缓存命中 3.vector的结构 二、vector的函数 1.构造函数&#xff08;创建&#xff09;​编辑 2.Iterator&#xff08;迭代器&#xff09; 3.Capacity&#xff08;容量&#xff09; 三、迭代器失效 …

数据库性能优化的解决方案

目录​​​​​​​ 1、什么是数据库性能优化 1.1 数据库性能优化的概念 1.2 为何需要进行数据库性能优化 1.3 数据库性能优化的好处 2、数据库性能优化的基本原理 2.1 数据库查询优化 2.2 数据库索引优化 2.3 数据库表结构优化 2.4 数据库硬件优化 3、数据库查询优化…

一个好用的服务器控制面板

简介 它是一个免费开源的管理面板工具&#xff0c;可以帮助你集中管理多个服务器和网站。Ajenti 支持 Linux、BSD、Mac OS X和Windows 等多个操作系统&#xff0c;并且可以通过一个直观的 Web 界面来完成各种系统管理任务。 相比于其他管理面板&#xff0c;Ajenti有以下几个优…

go语言数组和切片

1. 数组Array Golang Array和以往认知的数组有很大不同。 1. 数组&#xff1a;是同一种数据类型的固定长度的序列。2. 数组定义&#xff1a;var a [len]int&#xff0c;比如&#xff1a;var a [5]int&#xff0c;数组长度必须是常量&#xff0c;且是类型的组成部分。一旦定义&…

数字主持人有多少种应用方式?

在数字经济时代下&#xff0c;越来越多企业、品牌以数字人进行新闻资讯报道、主持互动、人机交互等多形式&#xff0c;提升企业、品牌的影响力和认知度。 *图片源于网络 如山东广播电视台数字主持人“海蓝”&#xff0c;不仅可以用大会活动现场&#xff0c;用多国语言与主持人、…

从零开始c++精讲:第四篇——模板初阶

文章目录 一、泛型编程二、函数模板2.1函数模板概念2.2函数模板格式2.3函数模板原理2.4函数模板实例化2.5函数模板匹配原则 三、类模板3.1类模板的定义格式3.2类模板的实例化 一、泛型编程 如何实现一个通用的交换函数呢&#xff1f; void Swap(int& left, int& righ…

ios适配虚拟home键

在H5开发过程中遇到一个兼容性问题。iphone手机的虚拟home键会对屏幕底部的内容造成遮挡。要处理此问题&#xff0c;需要清楚安全区域这个概念。 安全区域 根据刘海和虚拟Home键&#xff0c;Apple为其设备提供了屏幕安全区域的视觉规范 竖屏&#xff1a;竖屏的时候&#xff…

基于springboot在线学习平台源码和论文

在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括学习平台的网络应用&#xff0c;在外国学习平台已经是很普遍的方式&#xff0c;不过国内的管理平台可能还处于起步阶段。学习平台具有学习信息管理功能的选择。学习平台采用ja…

PWN入门Protostar靶场Stack系列

Protostar靶场地址 https://exploit.education/protostar/溢出 源码分析 #include <stdlib.h> #include <unistd.h> #include <stdio.h>int main(int argc, char **argv) {volatile int modified; //定义一个变量char buffer[64]; //给…

C++:优先队列-Priority_queue

目录 1.关于优先队列 2.priority_queue的使用 1.构造方法 2.empty();判空 3.size(); 4.top(); 5.push(val); 6.pop(); 3.优先队列模拟实现 4.用优先队列解决数组中第K个大的元素 1.关于优先队列 在C中&#xff0c;可以使用STL&#xff08;标准模板库&#xff09;中的p…

软件测试的调用接口怎么调用,逻辑是什么?

一、什么是接口测试&#xff1f; 接口测试是测试系统组件之间接口的测试。接口主要用于检测外部系统和内部子系统之间的交互点。测试的重点是检查数据交换、传输、控制和管理过程&#xff0c;以及系统之间的相互逻辑依赖。 二、为什么要做接口测试&#xff1f; 在淘宝系统的…

SpringBoot使用Swagger2生成接口文档

一、导入依赖 <!-- knife4j--><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>2.0.7</version></dependency> 二、配置类 通过一下配置&am…

【并发编程】活锁

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程 ⛺️稳重求进&#xff0c;晒太阳 活锁 定义&#xff1a;活锁出现在两个线程互相改变对象的结束条件&#xff0c;最后谁也无法结束 代码示例 public class TestLiveLock {stati…

java web mvc-03-JFinal

拓展阅读 Spring Web MVC-00-重学 mvc mvc-01-Model-View-Controller 概览 web mvc-03-JFinal web mvc-04-Apache Wicket web mvc-05-JSF JavaServer Faces web mvc-06-play framework intro web mvc-07-Vaadin web mvc-08-Grails JFinal JFinal 是基于 Java 语言的极…

策略模式在AIBOT项目中的实际应用

原文链接https://www.jylt.cc/#/detail?activityIndex2&id8d1912358fa1c1d8db1b44e2d1042b70AIBOT 你想 我来做AIBOThttps://chat.jylt.top/ 定义 策略模式&#xff08;Strategy Pattern&#xff1a;Define a family of algorithms,encapsulate each one,and make them …