我需要将日期列解析为字符串,这很有效,但我遇到了一些问题,首先是没有将字符串数据类型作为输出:
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()