我正在使用bash脚本,想做一个从3个小时前到3个小时后的时间循环.例如,伪码如下:

time_end = 2000010100              #YYYYMMDDHH
time_beg = 1996010100              #YYYYMMDDHH
for time_beg -le time_end          # while time_beg<=time_end
    time_tmp = time_beg + 3 hours
    do some calculation from time_beg to time_tmp
    time_beg = time_tmp
end for

并且部件do some calculation from time_beg to time_tmp是用于模拟从1996-01-01-001996-01-01-03(例如)的东西的模型.然后下一次运行将从1996-01-01-031996-01-01-06开始.

为了完成time_tmp = time_beg + 3 hours的部分,我使用以下代码:

YMDH=$YYYYMMDDHH
time_resolution=3
INC=+${time_resolution}hours
YMDH_newend=`date +%Y%m%d%H -d "${YMDH::8} ${YMDH:8:2} ${INC}"`
echo ${YMDH_newend}

我测试它工作得很好,但在$YYYYMMDDHH=1996033$YYYYMMDDHH=1996033105的时候出错.运行上面的代码得到的结果是$YYYYMMDDHH=1996033105,这是错误的,应该是$YYYYMMDDHH=1996033104...

那到底发生了什么?或者,有没有更聪明的方法来做到这一点?就像使用Python 一样?大概$(python -c "print(blablabla about YYYYMMDDHH)")个?

谢谢!

推荐答案

您遇到的问题可能是由于夏令时的原因.1996年3月31日,许多国家的时钟在凌晨1:00拨快一小时,实际上把凌晨2:00的时间跳到了凌晨3:00这就是为什么当你将3个小时加到凌晨1:00时,结果是凌晨5:00,而不是凌晨4:00

如果要避免此问题,可以使用UTC时间,因为它不遵守夏令时.您可以通过在时间字符串后附加Z来在DATE命令中指定UTC时间:

YMDH=$YYYYMMDDHH
time_resolution=3
INC=+${time_resolution}hours
YMDH_newend=`date -u +%Y%m%d%H -d "${YMDH::8}T${YMDH:8:2}Z ${INC}"`
echo ${YMDH_newend}

请注意DATE命令中的-u选项,它告诉它使用UTC时间,以及日期字符串中的T和Z,它们以UTC的ISO 8601格式指定时间.

或者,您也可以使用Python进行日期运算,它可以更优雅地处理这些边缘情况:

YMDH=$YYYYMMDDHH
time_resolution=3
YMDH_newend=$(python -c "from datetime import datetime, timedelta; dt = datetime.strptime('$YMDH', '%Y%m%d%H'); dt += timedelta(hours=$time_resolution); print(dt.strftime('%Y%m%d%H'))")
echo ${YMDH_newend}

此Python脚本将日期字符串解析为DateTime对象,将指定的小时数添加到该对象中,然后将其格式化为字符串.

Python相关问答推荐

线性模型PanelOLS和statmodels OLS之间的区别

Pandas 滚动最接近的价值

处理(潜在)不断增长的任务队列的并行/并行方法

Python 约束无法解决n皇后之谜

使用miniconda创建环境的问题

不理解Value错误:在Python中使用迭代对象设置时必须具有相等的len键和值

在pandas中使用group_by,但有条件

不允许访问非IPM文件夹

Python逻辑操作作为Pandas中的条件

需要帮助重新调整python fill_between与数据点

使用Python和文件进行模糊输出

基于Scipy插值法的三次样条系数

为什么我的sundaram筛这么低效

什么是一种快速而优雅的方式来转换一个包含一串重复的列,而不对同一个值多次运行转换,

用fft计算指数复和代替求和来模拟衍射?

我可以不带视频系统的pygame,只用于游戏手柄输入吗?''

每次查询的流通股数量

为罕见情况下的回退None值键入

Pandas:计数器的滚动和,复位

python3中np. divide(x,y)和x/y有什么区别?'