单仁做的网站宁波网站关键词优化排名
说明
之前确定了时间轴(千年历),以及时间的转换方法。其中时间轴的数据将会存储在集群,以及通过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两种。
略。
结尾
- 略的原因是当前没什么需求,从原理上看也不存在障碍,所以先不开发。关键点还是先把现有的功能在对象中实现。
- 接下来主要将转换和偏移的基本功能封装进ATimer2就可以完成本次的项目任务了。