如何更改日期时间分辨率



有没有一种简单的方法来说明

a = '2020-01-01 19:30:33.996628' 
b = '2020-01-01 19:30:34' 

ab是平等的。如果将a的时间分辨率更改为秒,则a可能等于b。如何用代码实现它?

为了清楚起见,以下选项与舍入不同,四舍五入可能会产生模棱两可的结果(例如,浮点数学是否被破坏?

设置为下一秒

  • 添加1e6a.microsecond之间的timedelta差异
from datetime import timedelta, datetime
a = datetime.fromisoformat('2020-01-01 19:30:33.996628')
a = a + timedelta(microseconds=(1e6 - a.microsecond))
print(a)
>>> datetime.datetime(2020, 1, 1, 19, 30, 34)
print(a.strftime('%Y-%m-%d %H:%M:%S'))
>>> 2020-01-01 19:30:34

设置为当前秒

  • .replace(microsecond=0)
from datetime import datetime
a = datetime.fromisoformat('2020-01-01 19:30:33.996628')
print(a)
>>> datetime.datetime(2020, 1, 1, 19, 30, 33, 996628)
a = a.replace(microsecond=0)
print(a)
>>> datetime.datetime(2020, 1, 1, 19, 30, 33)

如果将它们都视为datetime对象,则可以对它们使用算术运算符。例如,您可以减去它们并检查结果是否满足条件(例如不到一分钟的差异)

一种更简单的方法来使用舍入进行比较:-

import datetime
from dateutil import parser
a = '2020-01-01 19:30:33.996628' 
b = '2020-01-01 19:30:34' 
a = parser.parse(a)
b = parser.parse(b)
a == b
False
format_str = '%Y-%m-%d %H:%M'
a_rounded = datetime.datetime.strptime(datetime.datetime.strftime(a, format_str), format_str)
b_rounded = datetime.datetime.strptime(datetime.datetime.strftime(b, format_str), format_str)
a_rounded == b_rounded
True

为此,您可以根据需要添加灵活性,就像我在Minutes中四舍五入到比较一样。 所以在你的情况下,format_str是这样的:-

format_str = '%Y-%m-%d %H:%M:%S'

其他答案不执行四舍五入到最接近的秒,这通常是此类任务的最佳解决方案。下面datetime_round_s()函数执行这种舍入:

import datetime
def datetime_round_s(date_time: datetime.datetime) -> datetime.datetime:
return (date_time + datetime.timedelta(microseconds=5e5)).replace(microsecond=0)
a = datetime.datetime.fromisoformat('2020-01-01 19:30:33.996628')
b = datetime.datetime.fromisoformat('2020-01-01 19:30:34')
print(a)
print(datetime_round_s(a))
print(datetime_round_s(a) == b)

奥图普特:

2020-01-01 19:30:33.996628
2020-01-01 19:30:34
True

注意:如果舍入偏差可能是一个问题,则应更改算法。例如,请参阅将一半四舍五入为偶数。

最新更新