我有一个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'
但这并没有按预期发挥作用。
答案 0 :(得分:1)
在第一个f
功能中,更改
if row['FFD'] < sixty:
到
if row['FFD'] and row['FFD'] < sixty:
解决了OP的问题。
如果if row['FFD']
包含True
,row['FFD']
或NoneType
以外的任何内容, 0
将评估为False
。这是检查None
是否存在的Pythonic方法。请注意,由于逻辑运算符的短路行为,检查None
应始终首先置于复合条件中。因此if row['FFD'] and row['FFD'] < sixty:
会有效,但if row['FFD'] < sixty and if row['FFD']
会赢。