【问题标题】:Pandas: FutureWarning: Use pd.to_datetime instead熊猫:FutureWarning:改用 pd.to_datetime
【发布时间】:2021-05-10 09:34:27
【问题描述】:

我正在使用 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:

改用 pd.to_datetime。

return generic_parser(date_parser, *date_cols)

我在某处读到 Pandas 正在弃用日期时间。

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

编辑:对缺乏明确性表示歉意。 client_file 日期时间对象如下:

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')}
)

【问题讨论】:

  • 嘿。第二个选项有效,但仍然给我未来的警告。我不确定第一个选项返回的是什么,但它无法将日期匹配为 str...
  • 你能从我编辑的答案中检查解决方案吗?
  • @NandoCarnielMachado 我仍然认为转换为 pandas 日期时间是多余的......你只需要在 pd.read_excel 中设置converters={'Event Date': lambda x: x.strftime('%Y-%m-%d')},但不要设置 parse_dates。
  • @MrFuppes 谢谢,我会看看这是否有效。 parse_dates 到底在那里做什么?
  • parse_dates 如果列在 Excel 中未格式化为日期/时间,则很有帮助(顺便说一句,pd.read_csv 也存在 kwarg,它通常在那里更有用)。关键是 pandas 只是使用其他包来实际解码 Excel 文件(例如 openpyxl)。该代码将 Excel 序列日期转换为 Python 日期时间。 pandas 然后转换为其内置的 datetime dtype - 除非您将转换器设置为拦截...

标签: python pandas dataframe datetime date-parsing


【解决方案1】:

使用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')}
    )

【讨论】:

  • 太好了,第二个选项效果很好!谢谢!我之前尝试过转换器,但我发现处理使用字符串切片而不是 strftime 看起来很笨拙。
  • 有没有办法在读取 CSV 时而不是在创建数据框之后处理这种解析?
  • 既然 YYYY-MM-DD 格式没有改变,那么只在空间上拆分并丢弃 HH:MM:SS 不是更有效吗?解析为 datetime 似乎没有必要,因为所需的输出 dtype 是字符串。
  • @MrFuppes - 是的,但似乎来自 excel 的输入数据是 datetimes
  • @jezrael 谢谢,第二个解决方案是我正在寻找的:没有“未来警告”并且代码按预期工作。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2018-10-18
  • 2022-11-19
  • 2019-11-25
  • 1970-01-01
  • 2020-10-06
  • 2020-10-02
  • 2017-03-08
相关资源
最近更新 更多