python - 使用 Python 缩放日期范围
问题描述
这是问题所在:
我有一组(大)日期,时间跨度为公元 2100 年到 2300 年之间的 200 年,例如:
raw = [
'2100-09-01',
'2200-03-07',
'2295-07-27'
]
(等大约 100 万个日期)我需要将日期转换为 1988 年到 2002 年之间的更小(更早,也不是十的倍数)范围,例如:
transformed = [
'1988-09-01',
'1998-03-08',
'2001-08-01'
]
...这样就保留了原始范围的最小值/平均值/最大值的原始值分布,并且日期有效(即非闰年的 2 月 29 日)。
解决方案
尝试使用toordinal()
. 公元 1 年 1 月 1 日的序数是 1。
ordinals = [d.toordinal() for d in raw]
现在你有一个数字列表,很容易扩展:
def scale_num(raw, target_max, target_min, source_max, source_min):
scaled = (((raw - source_min)/(source_max - source_min))*(target_max - target_min))+target_min
return scaled
target_min = datetime.datetime(1988,1,1).toordinal()
target_max = datetime.datetime(2001,12,31).toordinal()
source_max = max(ordinals)
source_min = min(ordinals)
scaled = [round(scale_num(d, target_max, target_min, source_max, source_min)) for d in ordinals]
要将序数转换为日期,请使用date.fromordinal()
:
date = date.fromordinal(1).isoformat()
推荐阅读
- python-3.x - python中的float问题(计算不正确)
- python - 将字符串转换为时间戳python
- javascript - 在 Reactjs 中集成购买的引导模板,但是 js 效果不起作用
- python - 使用 c_types 改进 C 代码的 Python Wrapper
- java - Python 斯坦福 NER 标记器未知文件错误
- ios - 在 SwiftUI 中实现图像裁剪器视图工具
- linux - Yocto - “/bin/sh: 1: bc: not found”
- python - Python3:从子进程中捕获 SIGTTOU 并打印警告
- java - Maven 插件依赖项无法解析来自内部仓库的依赖项
- python - MA模型总是在时间序列中给出相同的输出(python)