确定x是否对浮点数和时间增量均为正

时间:2018-11-26 15:15:19

标签: python numpy datetime timedelta

我正在寻找一种简单整洁的方法来检查变量是否为正数,该变量可以是浮点数或numpy.timedelta64datetime.timedelta

我显然尝试过x>0,但这不适用于timedeltanumpydatetime都不行)

我发现的唯一解决方案是x/abs(x) > 0,我觉得它有点麻烦。 np.sign都没有返回答案。

有更好的方法来检查吗?

编辑: 每当x.total_seconds()为浮点型时,使用x都会返回错误。使用x > np.timedelta(0)datetime.timedelta不起作用。

3 个答案:

答案 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