【问题标题】:How to fix pandas FutureWarning: inferring datetime64[ns] from data containing strings is deprecated如何修复 pandas FutureWarning:不推荐从包含字符串的数据中推断 datetime64[ns]
【发布时间】:2022-11-10 05:50:41
【问题描述】:

在将熊猫升级到最新版本之前,我的以下代码运行良好:

def group_amounts_by_batch(self) -> pd.DataFrame:
    data_frame = (
        self.data_frame[self.columns.amount]
        .groupby(
            [
                self.data_frame[ExtraColumnNames.BatchId],
                self.data_frame[ExtraColumnNames.DepositId],
                self.data_frame[ExtraColumnNames.DepositAmount],
                self.data_frame[ExtraColumnNames.DepositDate],
                self.data_frame[ExtraColumnNames.BatchDate],
                self.data_frame[ExtraColumnNames.NonFundedAmount],
            ]
        )
        .sum()
        .reset_index()
    )
    data_frame = data_frame[data_frame[ExtraColumnNames.DepositId] != ""]
    data_frame = data_frame.round(2)
    return data_frame

但现在我收到以下警告:

FutureWarning:从包含字符串的数据推断 datetime64[ns] 已弃用,并将在未来版本中删除。要保留旧行为,请显式传递 Series(data, dtype={value.dtype}) .reset_index()

如何在我的代码中使用建议的解决方案 (explicitly pass Series(data, dtype={value.dtype}) .reset_index()) 来修复该警告?

data_frame.dtypes:
Batch Id                    object
Deposit Id                  object
Deposit Amount              object
Deposit Date        datetime64[ns]
Batch Date          datetime64[ns]
NonFunded Amount            object
amount                     float64
dtype: object

【问题讨论】:

  • self.data_frame,尤其是您的 DepositDateBatchDate 列来自哪里你执行这个group_amounts_by_batch 函数?就我而言,我有一列包含通过 pandas 的read_excel 摄取的日期值。我已经有一个转换器函数的字典,所以为包含日期值的列添加一个额外的函数对我有用。如果您不需要转换器,并且您正在使用 read_xxx 函数之一,那么使用 dtypes=... 参数可能是您的答案。

标签: python pandas


【解决方案1】:

在解析带有字符串日期的 excel 文件时,我收到了类似的警告:

df = pd.read_excel('path/to/file')

帮助我摆脱它的解决方法如下:

df = pd.read_excel('path/to/file', 
                    parse_dates=['col_date1', 'col_date2', ...], 
                    date_parser=lambda x: pd.to_datetime(x))

因此,在您的情况下,尝试使用 pd.to_datetime() 函数将日期列包装在分组数组中。但是,值得重构准备初始帧self.data_frame 的部分代码并考虑在那里解析正确的日期列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 2017-01-05
    • 2019-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多