如何用熊猫中的有效日期替换超出范围的日期

时间:2020-01-04 13:04:15

标签: python pandas datetime

我有一个包含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年之后的生日?

2 个答案:

答案 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并创建一系列可接受的日期。然后,如果有任何超出范围的内容,您可以填充值或用更明智的方式替换它们。

相关问题