无法应用函数,因为我有 NaN
Can't apply a function because I have NaN
我正在尝试将日期格式更改为列,但我无法应用我的函数,因为我有 NaN 单元格。
# change date format
def dmy_to_dmy(d):
return datetime.strptime(d, '%d %B %Y').strftime('%d/%m/%Y')
dates2['Dates_Reins'] = dates2['Dates_Reins'].apply(dmy_to_dmy)
我的数据是这样的:
46 9 September 2021
47 NaN
48 24 July 2021
49 28 September 2021
50 18 October 2021
51 8 January 2021
52 NaN
谢谢
您可以在开始使用它之前检测函数的输入是否是 Nan
值和 return 它:
def dmy_to_dmy(d):
if d == np.nan:
return np.nan
return datetime.strptime(d, '%d %B %Y').strftime('%d/%m/%Y')
有两种选择,忽略问题或检测问题。第一个是简单的,因为如果没有发生,你会尝试通过。第二个将检测 NaN
第一个解决方案
# change date format
def dmy_to_dmy(d):
try:
return datetime.strptime(d, '%d %B %Y').strftime('%d/%m/%Y')
except TypeError:
return d
dates2['Dates_Reins'] = dates2['Dates_Reins'].apply(dmy_to_dmy)
第二种解决方案
# change date format
def dmy_to_dmy(d):
if d == np.nan:
return d
else:
return datetime.strptime(d, '%d %B %Y').strftime('%d/%m/%Y')
dates2['Dates_Reins'] = dates2['Dates_Reins'].apply(dmy_to_dmy)
因为你没有提供数据d==np.nan
你得自己找
您可以让您的函数忽略 NaN:
def dmy_to_dmy(d):
if isinstance(d, float) and np.isnan(d):
return np.nan
return datetime.strptime(d, '%d %B %Y').strftime('%d/%m/%Y')
dates2['Dates_Reins'] = dates2['Dates_Reins'].apply(dmy_to_dmy)
或者,仅在 non-NaN 值上调用您的函数:
notna = dates2['Dates_Reins'].notna()
dates2['Dates_Reins'] = dates2.loc[notna, 'Dates_Reins'].apply(dmy_to_dmy)
尝试:
dates2['Dates_Reins'].apply(lambda x: dmy_to_dmy(x) if x != np.nan else x)
灵感来自:
我不会在这里使用 apply
:
dates2['Dates_Reins'] = (
pd.to_datetime(dates2['Dates_Reins'], format='%d %B %Y')
.dt.strftime('%d/%m/%Y')
)
pd.to_datetime()
可以代替strptime()
.dt
访问器允许直接访问 strftime()
这更快并且隐式处理缺失值。
我正在尝试将日期格式更改为列,但我无法应用我的函数,因为我有 NaN 单元格。
# change date format
def dmy_to_dmy(d):
return datetime.strptime(d, '%d %B %Y').strftime('%d/%m/%Y')
dates2['Dates_Reins'] = dates2['Dates_Reins'].apply(dmy_to_dmy)
我的数据是这样的:
46 9 September 2021
47 NaN
48 24 July 2021
49 28 September 2021
50 18 October 2021
51 8 January 2021
52 NaN
谢谢
您可以在开始使用它之前检测函数的输入是否是 Nan
值和 return 它:
def dmy_to_dmy(d):
if d == np.nan:
return np.nan
return datetime.strptime(d, '%d %B %Y').strftime('%d/%m/%Y')
有两种选择,忽略问题或检测问题。第一个是简单的,因为如果没有发生,你会尝试通过。第二个将检测 NaN
第一个解决方案
# change date format
def dmy_to_dmy(d):
try:
return datetime.strptime(d, '%d %B %Y').strftime('%d/%m/%Y')
except TypeError:
return d
dates2['Dates_Reins'] = dates2['Dates_Reins'].apply(dmy_to_dmy)
第二种解决方案
# change date format
def dmy_to_dmy(d):
if d == np.nan:
return d
else:
return datetime.strptime(d, '%d %B %Y').strftime('%d/%m/%Y')
dates2['Dates_Reins'] = dates2['Dates_Reins'].apply(dmy_to_dmy)
因为你没有提供数据d==np.nan
你得自己找
您可以让您的函数忽略 NaN:
def dmy_to_dmy(d):
if isinstance(d, float) and np.isnan(d):
return np.nan
return datetime.strptime(d, '%d %B %Y').strftime('%d/%m/%Y')
dates2['Dates_Reins'] = dates2['Dates_Reins'].apply(dmy_to_dmy)
或者,仅在 non-NaN 值上调用您的函数:
notna = dates2['Dates_Reins'].notna()
dates2['Dates_Reins'] = dates2.loc[notna, 'Dates_Reins'].apply(dmy_to_dmy)
尝试:
dates2['Dates_Reins'].apply(lambda x: dmy_to_dmy(x) if x != np.nan else x)
灵感来自:
我不会在这里使用 apply
:
dates2['Dates_Reins'] = (
pd.to_datetime(dates2['Dates_Reins'], format='%d %B %Y')
.dt.strftime('%d/%m/%Y')
)
pd.to_datetime()
可以代替strptime()
.dt
访问器允许直接访问strftime()
这更快并且隐式处理缺失值。