new pandas apply 'float' 对象不可订阅

new pandas apply 'float' object is not subscriptable

我有一个 df,其中日期列为 MM-DD-YYYY 字符串。我想将其转换为 YYYY/MM/DD 字符串。我尝试了以下方法:

def date_MDY_YMD(s):
    """Convert string date from MM/DD/YYYY to YYYY-MM-DD."""
    M = s[:2]
    D = s[3:5]
    Y = s[6:10]
    return '-'.join((Y, M, D))

df['Date'] = df['Date'].apply(date_MDY_YMD)

我收到错误“类型错误:'float' 对象不可订阅” 'float' 让我感到困惑:df.dtypes 告诉我 Date 是一个对象,但我看过的所有示例都是字符串。

Whosebug 上也有类似的问题,但它们关注的是在列上使用 apply() 或需要获取多个列的速度问题。这里也不是困难。

任何帮助将不胜感激。

FWIW,我不会通过以下输入重现您的问题。

df = pd.DataFrame({'Date': ['08-03-2022', '31-12-2022']})

您可能有 NaN,因为此输入会触发错误:

df = pd.DataFrame({'Date': ['08-03-2022', '31-12-2022', float('nan')]})

也就是说,不要使用 apply,它很慢。利用 pandas 向量函数(您也不会有缺失值的问题)。

使用pandas.to_datetime:

df['Date2'] = pd.to_datetime(df['Date'], dayfirst=True).dt.strftime('%Y/%m/%d')

使用 str.replace 和正则表达式替换字符串:

df['Date3'] = df['Date'].str.replace(r'(\d{2})-(\d{2})-(\d{4})', r'//',
                                     regex=True)

输出:

         Date       Date2       Date3
0  08-03-2022  2022/03/08  2022/03/08
1  31-12-2022  2022/12/31  2022/12/31
2         NaN         NaN         NaN