Pandas:未来警告:请使用pd.to_datetime而非原先的方法

4

我正在使用Pandas读取.xlsx文件,代码如下:

    client_df = pd.read_excel(
    client_file, 
    header = 1,
    parse_dates = ['Event Date'], 
    date_parser = lambda x: datetime.strftime(x, '%Y-%m-%d')
    )

这个可以正常工作,但是我从Pandas得到了以下警告:

.venv/lib/python3.8/site-packages/pandas/io/parsers.py:3339: FutureWarning:

Use pd.to_datetime instead.

return generic_parser(date_parser, *date_cols)

我在某处读到Pandas正在弃用datetime。

  • 有人能帮我将date_parser表达式转换为使用pd.to_datetime吗?

编辑:抱歉没有说明清楚。client_file datetime对象如下所示:

YYYY-MM-DD HH:MM:SS

我需要提取以下内容,作为str对象:

YYYY-MM-DD

编辑:@jezrael的答案(下面)完美地解决了问题 - 谢谢jezrael!

client_df = pd.read_excel(
client_file, 
header = 1,
parse_dates = ['Event Date'],
converters={'Event Date': lambda x: pd.to_datetime(x).strftime('%Y-%m-%d')}
)

编辑2:@MrFuppes指出我根本不需要解析日期。在这种情况下,他的解决方案可能更好,如下所示:

client_df = pd.read_excel(
client_file,
header = 1,
converters = {'Event Date': lambda x: x.strftime('%Y-%m-%d')}
)

嗨。第二个选项可以工作,但仍然会给出未来警告。我不确定第一个选项返回什么,但它无法将日期与字符串匹配... - Nando Machado
你能检查一下我修改后的答案吗? - jezrael
1
@NandoCarnielMachado 我仍然认为将其转换为pandas日期时间是多余的...你只需要在pd.read_excel中设置converters={'Event Date': lambda x: x.strftime('%Y-%m-%d')},但不要设置parse_dates。 - FObersteiner
@MrFuppes 谢谢,我会看看它是否有效。parse_dates 到底在那里做什么? - Nando Machado
如果Excel中的列未格式化为日期/时间,则parse_dates很有用(顺便提一下,对于pd.read_csv也存在该kwarg,通常在那里更有用)。关键是pandas仅使用其他软件包来实际解码Excel文件(例如openpyxl)。该代码将Excel序列日期转换为Python datetime。然后,pandas将其转换为内置的datetime dtype - 除非您设置转换器以拦截它... - FObersteiner
显示剩余2条评论
1个回答

2

使用Series.dt.strftime函数:

client_df = pd.read_excel(
    client_file, 
    header = 1,
    parse_dates = ['Event Date']
    )

client_df['Event Date'] = client_df['Event Date'].dt.strftime('%Y-%m-%d')

如果需要使用read_excel解决方案,请使用converters

client_df = pd.read_excel(
    client_file, 
    header = 1,
    parse_dates = ['Event Date'],
    converters={'Event Date': lambda x: pd.to_datetime(x).strftime('%Y-%m-%d')}
    )

另一个想法是只使用strftime, 就像@MrFuppes所指出的那样:
client_df = pd.read_excel(
    client_file, 
    header = 1,
    parse_dates = ['Event Date'],
    converters={'Event Date': lambda x: x.strftime('%Y-%m-%d')}
    )

1
太好了,第二个选项完美地解决了问题!谢谢你!我之前尝试过转换器,但我发现使用字符串切片比strftime更加笨拙。 - Nando Machado
2
有没有一种方法可以在读取CSV时处理这个解析,而不是在创建数据帧之后再处理? - Nando Machado
1
由于YYYY-MM-DD格式不会改变,仅在空格上拆分并丢弃HH:MM:SS是否更有效率?由于所需输出的数据类型为字符串,因此解析为日期时间似乎是不必要的。 - FObersteiner
1
@MrFuppes - 是的,但看起来从Excel输入的数据是“datetimes”类型。 - jezrael
1
@jezrael 谢谢,第二种解决方案正是我在寻找的:没有"未来警告",代码按预期工作。非常感谢! - Nando Machado
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接