python - 如何用熊猫中的有效日期替换超出范围的日期
问题描述
我有一个包含 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 年之后的生日?
解决方案
我试图制作一个简单的数据框:
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