【发布时间】:2018-02-13 19:55:32
【问题描述】:
我有一个从 pd.read-sql 查询创建的 pandas 列。该列中有空日期,它们以 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'
但这并没有按预期工作。
【问题讨论】:
-
在您的第一个函数中,将
if row['FFD'] < sixty:更改为if row['FFD'] and row['FFD'] < sixty:可能会有所帮助。在你的函数的第二个版本中,函数头有一个错字。将(f)row更改为f(row)。 -
哇 - 多么简单。只需从您的第一个建议中添加 and 就可以完美地工作。如果 row['FFD'] 和...做什么?
-
哦,是的,谢谢!!!
-
Jason,我在下面的答案中添加了
if row['FFD']的解释。
标签: python-3.x datetime comparison-operators