Python一些可能用的到的函数系列123 ATimer2-时间偏移

本文详细介绍了在IT技术背景下,如何处理时间轴数据,包括名义日历和绝对间隔的应用,以及针对报表和程序执行场景的时间点和时间段转换。重点讨论了字符和数值表示的时间处理方法,以及如何计算时间偏移和区间选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明

之前确定了时间轴(千年历),以及时间的转换方法。其中时间轴的数据将会存储在集群,以及通过RedisOrMongo保存部分常用的数据。

本次讨论时间偏移的度量问题。

内容

1 两种形式

我们提到时间时,通常会有两种方式:

  • 1 按照名义日历,例如月末、年末。
  • 2 按照绝对间隔,例如10分钟后,2天后。

第一种应用通常出现在报表需求上,例如,在每个月1号,统计上个月(周期描述)的所有交易额。这个时候,名义的描述是准确的,但是每个月有大小月,还有平闰月。这种需求,通过名义时间轴就可以较容易的处理。之类应用的间隔,可以以"c"开头,意味着字符推断,或者日历推算。

第二种应用通常出现在程序执行上,例如,每分钟执行一次程序;或5分钟后执行某个程序。

就时间的描述来说,又存在两种方式:

  • 1 某个时间点。
  • 2 某个时间段。

所以以下分为四种情况加以讨论:

  • 1 字符·时间点
  • 2 字符·时间段
  • 3 数值·时间点
  • 4 数值·时间段

2 字符·时间点

具体的语言描述可能会有更多可能,以下仅描述几种常用的,需要的以后再加就可以了。

2.1 end_of_last_month

采用当月时间再前推一天

严格来说是end day of last month。
假设已经有了yymon_dict,这是由每个月首日与对应时间戳构成的有序字典。
将键拿出来,构成列表

time_axis = np.array(list(yymon_dict.values()))
dt_axis = list(yymon_dict.keys())

其中dt_axis是字符型的日期列表,time_axis是对应的时间戳。

给定任意一个时间,推算上个月的时间点

# 任意字符串时间
some_dt_str = '2024-01-31 11:11:11'
# 从字符串时间中提取月初、日时分秒
yymon, dhms  =depart_mon_ddhhmmss(some_dt_str)
# 推算月初的上一日
month_ts = yymon_dict[yymon] - 86400
# 以下是ATimer2-时间转换部分的过程,之后会封装
# 将时间戳转为字符
# 获取目标时间戳的最近一个月位置
pos= max(np.where(time_axis <= month_ts)[0])
# 获取月份的基础字符串
base_dt = dt_axis[pos]
# 获取月份的基础时间戳
base_ts = time_axis[pos]
# 计算当前时间戳和月基础时间戳的差距
gap_ts = month_ts - base_ts
# 计算月内的偏移时间字符串,然后拼接
char_ts = base_dt[:7] + gapts2day(gap_ts)
'2023-12-31 00:00:00'

整个过程还是以查表和简单四则运算进行推算进行的,速度应该会比较快。

时间的转换还是一个更底层的功能,之后开始组装对象时,这个转换过程会比较快。

2.2 approximate_day_of_last_month

2.3 end_of_next_month

往下推两个月,然后再回退一天

some_dt_str = '2024-01-31 11:11:11'
yymon, dhms  =depart_mon_ddhhmmss(some_dt_str)

# 下下个月:通过时间轴的位置索引推算
nn_month_pos = dt_axis.index(yymon) + 2
nn_month = dt_axis[nn_month_pos]

month_ts = yymon_dict[nn_month] - 86400

# 将时间戳转为字符
pos= max(np.where(time_axis <= month_ts)[0])
base_dt = dt_axis[pos]
base_ts = time_axis[pos]
gap_ts = month_ts - base_ts
char_ts = base_dt[:7] + gapts2day(gap_ts)
'2024-02-29 00:00:00'

3 字符·时间段

3.1 last_month_period

获取当月月初,和上月月初,推算中间的时隙即可

4 数值·时间点

默认按照左闭右开原则

4.1 last_n: 可选参为day, hour, minute, seconds,默认为0

原则上,在使用数值点判定时要求输入是数值(时间戳)。出于使用的方便,我们可以假定,用户可以指定字符或者数值,由对象内部进行自动转换。

假定,用户给到了字符,在有yymon_dict的情况下,很容转为时间戳

# 字符到时间戳
some_dt_str = '2024-01-31 11:11:11'
yymon, dhms  =depart_mon_ddhhmmss(some_dt_str)
ts = yymon_dict[yymon] + ddhhmmss2s(dhms)

执行时间偏移

# 过去3天
last_n = 3
# 历史时间推算已完成
ts_hat = ts - last_n * 86400

再将时间戳进行转换

# 时间戳到字符
# 1 月日字符列表
# 2 推算位置
pos= max(np.where(time_axis <= ts_hat)[0])
base_dt = dt_axis[pos]
base_ts = time_axis[pos]
gap_ts = ts_hat - base_ts
char_ts = base_dt[:7] + gapts2day(gap_ts)
'2024-01-28 11:11:11'

4.2 next_n:可选参为day, hour, minute, seconds,默认为0

5 数值·时间段

5.1 last_n_period

5.2 next_n_period

5.3 period_btw

计算两个时间点之间的时间段

6 选择

时间操作一定会伴随着选择:选择数据中符合要求的记录。

6.1 对于点

进行筛选的规则为 gt, lt , eq, gte, lte 等五种。

略。

6.2 对于区间 period

一般来说分为 in 和out两种。

略。

结尾

  1. 略的原因是当前没什么需求,从原理上看也不存在障碍,所以先不开发。关键点还是先把现有的功能在对象中实现。
  2. 接下来主要将转换和偏移的基本功能封装进ATimer2就可以完成本次的项目任务了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值