【问题标题】:Determine if x is positive for both floats and timedeltas确定 x 对于浮点数和时间增量是否都是正数
【发布时间】:2018-11-26 15:15:19
【问题描述】:

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

我显然尝试过x>0,但这不适用于timedeltas(numpy's 或datetime's)

我找到的唯一解决方案是x/abs(x) > 0,我觉得有点麻烦。甚至np.sign 也没有返回答案。

有没有更好的方法来检查这个?

编辑: 只要x 是浮点数,使用x.total_seconds() 就会返回错误。使用x > np.timedelta(0) 不适用于datetime.timedeltas。

【问题讨论】:

  • 如果我使用x.total_seconds(),只要xfloat,就会出现错误
  • if isinstance(x, timedelta): return x.total_seconds() > 0 else: return x > 0
  • 当然。但我需要为np,timedelta64 添加一个案例,为datetime.timedelta 添加一个案例(因为它们是不同的类)和一个用于浮动的案例。如果这是最好的,我认为x/abs(x)>0仍然是一个更好的解决方案。
  • x==abs(x) 似乎两者都适用。不过,您可能需要检查零。

标签: python numpy datetime timedelta


【解决方案1】:

您可以与“零时间增量”对象进行比较,然后使用 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)

【讨论】:

    【解决方案2】:

    如果你愿意使用 pandas,你可以先将所有输入类型转换为 pandas 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)
    

    【讨论】:

      【解决方案3】:

      正如@NickChapman 所说,使用isinstance 可能更容易(阅读)。不要忘记您可以同时针对多个类测试数据类型:

      def check_positive(x):
          if isinstance(x, (datetime.timedelta, np.timedelta64)):
              return x.total_seconds() > 0
          else:
              return x > 0
      

      【讨论】:

        猜你喜欢
        • 2012-09-07
        • 1970-01-01
        • 2021-05-26
        • 2021-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        相关资源
        最近更新 更多