熊猫为什么会发出"未来警告"以及如何避免



我需要将日期列解析为字符串,这很有效,但我遇到了一些问题,首先是没有将字符串数据类型作为输出:

import pandas as pd  # No warning raised
exit_format = '%d-%m-%Y'
series = pd.Series([1,2,None] ,dtype='datetime64[ns]')
series.dt.strftime(exit_format)

这种(预期行为(不是什么大不了的,因为它可以用astype('string')来修复并替换Nan。但最糟糕的是,如果所有值都是NaN-Nat,我得到的是FutureWarning:

# Warning raised!
series = pd.Series([None,None,None] ,dtype='datetime64[ns]')
series.dt.strftime(exit_format)
FutureWarning: In a future version, the Index constructor will not infer numeric dtypes when passed object-dtype sequences (matching Series behavior)

这似乎来自pandas版本中的一个已知问题>=1.4.0(我的是"1.4.1"(。我的问题是,如何做出一个好的变通办法?当所有值都为楠时,为什么会首先出现此警告?最好我正在寻找一个解决方案,不直接压制警告,但他的起源。

基本上,我正在寻找一个函数,它将日期列转换为字符串列,但将NaN解析为空字符串,或者以更好的方式处理错误(如使用默认值(,但不会发出警告。

pd:一个可能的解决方案是在末尾添加一个非空行并将其删除,但我一直在犹豫是否有一些实现的函数实际上运行良好,而不使用技巧。。。

正如@finavatar:正确建议的那样,这里有一种更常用的方法来考虑NaT值(Pandas>=1.0.0(

import pandas as pd
series = pd.Series([None, None, None], dtype="datetime64[ns]")
series = series.apply(lambda x: x.strftime("%d-%m-%Y") if x is not pd.NaT else x)
print(series)  # No warning message
# Output
0   NaT
1   NaT
2   NaT
dtype: datetime64[ns]

与非空系列:

import pandas as pd
series = pd.Series(["04/03/2022", None, None], dtype="datetime64[ns]")
series = series.apply(lambda x: x.strftime("%d-%m-%Y") if x is not pd.NaT else x)
print(series)  # No warning message
0    03-04-2022
1           NaT
2           NaT
dtype: object  # == string

我最近也遇到了这个问题。我绕过这个警告的方法只是在使用strftime之前先检查日期值是否为非NaN。

示例:

if df['date'].isnull().values == False:
df['date'] = df['date'].dt.strftime('%b %d, %Y')

如果您需要检查日期列的ANY/ALL nan值:

语法:

df['your column name'].isnull().values.any()
df['your column name'].isnull().values.all()

相关内容

  • 没有找到相关文章

最新更新