使用NoneType评估datetime.date列

时间:2017-09-05 13:33:43

标签: python-3.x datetime comparison-operators

我有一个pandas列,是从pd.read-sql查询创建的。列中有空值日期,它们作为NoneTypes返回,如下所示。

FFD
2014-10-29
2015-06-03
None
2017-05-05


print(type(stores['FFD'][0]))
class datetime.date
print(type(stores['FFD'][2]))
class'NoneType'

然后我尝试运行以下函数:

sixty = now - timedelta(60)
def f(row):
    if row['FFD'] < sixty:
        val = 'SR'
    return val

stores['JRSR'] = stores.apply(f, axis = 1)

这会返回错误:

TypeError: ("'<' not supported between instances of 'NoneType' and 'datetime.date'", 'occurred at index 10')

我可以将列转换为字符串,以进行比较,但是我需要将此字段保留为下游用途的日期字段。我的转换代码是:

stores['FFD'] = pd.to_datetime(stores['FFD'])
stores['FFD'] = stores['FFD'].dt.strftime("%Y-%m-%d")

如何在不转换列的情况下使我的功能正常工作?基本上我希望我的函数只评估datetime.date对象。我试过了:

def(f)row:
    if isinstance(row['FFD'], NoneType):
         val = ""
    elif row['FFD'] < sixty:
         val = 'SR'

但这并没有按预期发挥作用。

1 个答案:

答案 0 :(得分:1)

在第一个f功能中,更改

if row['FFD'] < sixty:

if row['FFD'] and row['FFD'] < sixty:

解决了OP的问题。

如果if row['FFD']包含Truerow['FFD']NoneType以外的任何内容,

0将评估为False。这是检查None是否存在的Pythonic方法。请注意,由于逻辑运算符的短路行为,检查None应始终首先置于复合条件中。因此if row['FFD'] and row['FFD'] < sixty:会有效,但if row['FFD'] < sixty and if row['FFD']会赢。