如何修复 pandas FutureWarning:从包含字符串的数据推断 datetime64[ns] 已弃用

How to fix pandas FutureWarning: inferring datetime64[ns] from data containing strings is deprecated

提问人:Valip 提问时间:12/16/2021 更新时间:2/27/2023 访问量:6258

问:

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

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
蟒蛇 熊猫

评论

0赞 jwd630 8/15/2022
在执行此函数之前,特别是 your or 列从何而来?就我而言,我有一个列,其中包含通过 pandas 摄取的日期值。我已经有一个转换器函数的字典,所以为包含日期值的列添加一个额外的函数对我来说是诀窍。如果您不需要转换器,并且您使用的是read_xxx函数之一,那么使用参数可能是您的答案。self.data_frameDepositDateBatchDategroup_amounts_by_batchread_exceldtypes=...

答:

0赞 Vlad V 10/28/2022 #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, format='%Y-%m-%d'))

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

2赞 Anna Christiane Kolandjian 2/27/2023 #2

创建 DataFrame 时,应为数据指定 dtype 参数:

values = [(3, 'a'), (2, 'b'), (1, 'c'), (0, 'd')]
data = np.array(values, dtype=[('col_1', 'object'), ('col_2', 'datetime64')])
df = pd.DataFrame.from_records(data)

在您的例子中,当您创建 DataFrame 时,您只指定了值,而没有指定 dtype! 创建自己的 dtype 以将其添加到代码中。

您可以使用元组自动创建 dtype,假设您有 2 个列表:1 个列表“cols”用于 DataFrame 列,另一个列表“types”用于列类型。

dtype = [tuple([col, types[index]])
                    for index, col in enumerate(cols)]

评论

0赞 Domenico Spidy Tamburro 4/4/2023
更明确地说:顺便说一句,这非常有帮助dtype = [tuple([col, df.dtypes[index]]) for index, col in enumerate(df.columns)]
0赞 Anna Christiane Kolandjian 4/5/2023
是的@DomenicoSpidyTamburro对,我很高兴它有帮助!