首页 > 解决方案 > 如何用熊猫中的有效日期替换超出范围的日期

问题描述

我有一个包含 10,000 个条目的数据集,其中一个变量是生日。所有条目都是唯一的。我注意到大约 200 个条目的生日是 1/1/1900。下一个频繁日期的频率仅为 4,并且该日期在该数据集中也没有任何意义。我认为 1/1/1900 被用作占位符,因为生日不能为空。长话短说,我想使用回填方法将这些条目的日期替换为有效日期。

我将生日列更改为日期时间对象:

df['Client Birthdate'] = pd.to_datetime(df['Client Birthdate'], yearfirst=True)

然后我尝试使用:

timestamp = pd.Timestamp(year=1900, month=1, day=1)
df['Client Birthdate'] = df['Client Birthdate'].replace(to_replace=timestamp, method='bfill')

但是, df['Client Birthdate'].describe() 仍然给了我这个作为输出:

[198 rows x 9 columns]
count                   10000
unique                   7897
top       1900-01-01 00:00:00
freq                      198
first     1900-01-01 00:00:00
last      1999-12-30 00:00:00
Name: Client Birthdate, dtype: object

所以我尝试使用:

df['Client Birthdate'] = df['Client Birthdate'].replace(to_replace=timestamp, value=False)
df['Client Birthdate'] = df['Client Birthdate'].fillna(method='bfill')

这给了我:

[198 rows x 9 columns]
count     10000
unique     7897
top       False
freq        198
Name: Client Birthdate, dtype: object

我不知道为什么 replace/fillna 不起作用,它们与 datetime 对象不兼容吗?还有一种方法可以用有效日期替换所有“超出范围”的日期,比如 1920 年之前和 2001 年之后的生日?

标签: pythonpandasdatetime

解决方案


我试图制作一个简单的数据框:

df_dict = {
'Client Birthdate': '1/1/1900'
        }

df = pd.DataFrame(ddict, index=[i for i in range(len(ddict))])

调用 df:

  Client Birthdate
0         1/1/1900

然后,infer_datetime_format在 pd.to_datetime() 中使用:

df['Client Birthdate'] = pd.to_datetime(df['Client Birthdate'], infer_datetime_format=True)

再次调用 df 的输出:

  Client Birthdate
0       1900-01-01

而且,dtypes:

Client Birthdate    datetime64[ns]
dtype: object

但是,要将小时-分钟-秒-微秒结果放入您的列中,您必须知道并使用 strftime() 设置格式。这是一个简单的例子:

pd.to_datetime(df['Client Birthdate'], format='%Y-%m-%d').dt.strftime('%Y-%m-%d %H:%M:%S.%f')

输出:

0    1900-01-01 00:00:00.000000
Name: Client Birthdate, dtype: object

# 最后,要更新您的日期,只需对数据框进行分段并将其设置为您想要的日期。此示例使用 .loc() 因为 pandas 可能会通过 SettingWithCopyWarning 否则错误。

df.loc[df['Client Birthdate'] == '1/1/1900', :] = timestamp

推荐阅读