无法应用函数,因为我有 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()

这更快并且隐式处理缺失值。