有没有一种简单的方法来说明
a = '2020-01-01 19:30:33.996628'
b = '2020-01-01 19:30:34'
a
和b
是平等的。如果将a
的时间分辨率更改为秒,则a
可能等于b
。如何用代码实现它?
为了清楚起见,以下选项与舍入不同,四舍五入可能会产生模棱两可的结果(例如,浮点数学是否被破坏?
设置为下一秒
- 添加
1e6
和a.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
注意:如果舍入偏差可能是一个问题,则应更改算法。例如,请参阅将一半四舍五入为偶数。