我有一个包含10,000个条目的数据集,其中一个变量是生日。所有条目都是唯一的。我注意到大约有200个条目的生日是1/1/1900。下一个频繁的日期的频率仅为4,并且该日期在此数据集中也没有任何意义。我认为1900年1月1日被用作占位符,因为生日不能留空。长话短说,我想使用回填方法将这些条目的日期替换为有效日期。
我将带有生日的列更改为日期时间对象:
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年之后的生日?
答案 0 :(得分:0)
我试图制作一个简单的数据框:
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
然后在pd.to_datetime()中使用infer_datetime_format
:
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(),因为熊猫可能会通过SettingWithCopyWarning错误出现。
df.loc[df['Client Birthdate'] == '1/1/1900', :] = timestamp
答案 1 :(得分:0)
我也尝试替换,我认为问题是由于与正则表达式匹配,无论如何您都可以使用:
df["Client Birthday"].loc[df["Client Birthday"].eq(timestamp)] = np.nan
df["Client Birthday"] = df["Client Birthday"].bfill()
我分配了NaT
(不是时间),其中“客户生日”等于timestamp
变量,然后在系列中使用了bfill
。
对于第二个问题,您可以使用pandas between time并创建一系列可接受的日期。然后,如果有任何超出范围的内容,您可以填充值或用更明智的方式替换它们。