在我的数据中,我有一列称为到期日期,其中某些事件具有到期日期,而某些事件没有到期日期,所以当我加载日期时,该列看起来像以下对象加载的对象:
std::greater
然后我将其转换为带有强制错误的日期时间,从而使9999-12-31日期保留为NaT
expiration_date
2017-06-14
2018-01-15
9999-12-31
然后,我想创建一个函数,该函数创建一个新的列二进制列,如果到期日期为NaT,则该列为1,否则为0。我尝试了以下操作:
data.expiration_date = pd.to_datetime(data.expiration_date, errors = 'coerce')
但是我收到以下错误消息,我认为该错误消息试图在日期时间格式的列上使用isull。我还没有找到一种好的方法来解决datetime中的空值。
def status(data):
if data[data.expiration_date.isnull()]:
return 1
else:
return 0
data['event'] = data.apply(status, axis = 1)
任何想法,我是python的新手,任何帮助都会很棒!谢谢!
答案 0 :(得分:0)
isnull
是DataFrame
的一种方法,因此您不需要该方法。
我认为您想要的是:
data.expiration_date.isnull().astype(int)
答案 1 :(得分:0)
尝试使用lambda检查数据类型
示例数据框
mydict1 = {'expiration_date' : ['2017-06-14','2018-01-15','9999-12-31']}
df=pd.DataFrame(mydict1)
df.expiration_date=pd.to_datetime(df.expiration_date, errors = 'coerce')
print(df)
输出
expiration_date
0 2017-06-14
1 2018-01-15
2 NaT
仅保留日期部分
df.expiration_date.values.astype('M8[D]')
print(df)
对系列应用功能
def status(data):
if (type(data)!=datetime.date):
return 1
return 0
df['event']=df.expiration_date.dt.date.apply(status)
print(df)
输出
expiration_date event
0 2017-06-14 0
1 2018-01-15 0
2 NaT 1
没有lambda的较短解决方案
df['event']=df['expiration_date'].isnull().astype('int')
输出
expiration_date event
0 2017-06-14 0
1 2018-01-15 0
2 NaT 1
只是在尝试与上述类似的另一种解决方案
df['event']=0
df.loc[df.expiration_date.isnull(),'event']=1