我正在寻找一种简单整洁的方法来检查变量是否为正数,该变量可以是浮点数或numpy.timedelta64
或datetime.timedelta
。
我显然尝试过x>0
,但这不适用于timedelta
(numpy
或datetime
都不行)
我发现的唯一解决方案是x/abs(x) > 0
,我觉得它有点麻烦。 np.sign
都没有返回答案。
有更好的方法来检查吗?
编辑:
每当x.total_seconds()
为浮点型时,使用x
都会返回错误。使用x > np.timedelta(0)
对datetime.timedelta
不起作用。
答案 0 :(得分:2)
您可以与“零时间增量”对象进行比较,然后使用try
/ except
覆盖数字输入:
import numpy as np
from datetime import timedelta
def pos_check(x, zero_value=timedelta()):
try:
return x > zero_value
except TypeError:
return x > 0
py_td = timedelta(days=1) # 1-day, regular Python
np_td = np.timedelta64(py_td) # 1-day, NumPy
assert pos_check(1.5)
assert pos_check(py_td)
assert pos_check(np_td)
答案 1 :(得分:1)
如果您愿意使用熊猫,可以先将所有输入类型转换为熊猫Timedelta,然后在一行中检查阳性:
import numpy as np
import pandas as pd
from datetime import timedelta
def pos_check(x, zero_value=pd.Timedelta(0,'s')):
return pd.Timedelta(x) > zero_value
py_td = timedelta(days=1) # 1-day, regular Python
np_td = np.timedelta64(py_td) # 1-day, NumPy
pd_td = pd.Timedelta(np_td)
assert pos_check(1.5)
assert pos_check(py_td)
assert pos_check(np_td)
assert pos_check(pd_td)
答案 2 :(得分:0)
正如@NickChapman指出的那样,使用while IFS='' read -r line || [[ -n "$line" ]]; do
do thing with $line
done < "$1"
可能更容易(易于阅读)。不要忘记,您可以一次针对多个类测试数据类型:
isinstance