首页 > 解决方案 > 优雅高效的方式保留日期值,没有OOB错误

问题描述

我有一个如下所示的数据框

df1_new = pd.DataFrame({'person_id': [1, 1, 3, 3, 5, 5],'obs_date': ['7/23/2377  12:00:00 AM', 'NA-NA-NA NA:NA:NA', 'NA-NA-NA NA:NA:NA', '7/27/2277  12:00:00 AM', '7/13/2077  12:00:00 AM', 'NA-NA-NA NA:NA:NA']})

在此处输入图像描述

如您所见,我的日期值很少是out of bound值。但是,我仍然希望保持原样。不幸的是,由于OOB问题,我不能

我在下面试过

pd.to_datetime(df1_new['obs_date'], format='%m/%d/%Y %I:%M:%S %p', errors='coerce')

在此处输入图像描述

是否有任何其他有效的方法来保留日期值,但仅通过更改格式?如果它可以是字符串列/数据类型,我很好

我希望我的输出如下所示。

在此处输入图像描述

更新的尝试/除屏幕截图

在此处输入图像描述

标签: pythonpython-3.xpandasdataframedatetime

解决方案


您可以将值转换为日期时间,然后转换为日期,Period以便仅在 pandas 中表示out of bound值的可能格式。

如果省略它,则使用 python 日期时间对象,而不是熊猫日期时间(时间戳)。

from datetime import datetime
def str2time(x):
    try:
        return pd.Period(datetime.strptime(x, '%m/%d/%Y %I:%M:%S %p'), 'D')
    except:
        return np.nan

df1_new['obs_date'] = df1_new['obs_date'].apply(str2time)
print(df1_new)
   person_id    obs_date
0          1  2377-07-23
1          1         NaT
2          3         NaT
3          3  2277-07-27
4          5  2077-07-13
5          5         NaT

print(df1_new['obs_date'].dtype)
period[D]

如果可能的话,多种格式:

def str2time(x):
    try:
        #MM/DD/YYYY II:MM:SS pp like 7/23/2377  12:00:00 AM
        return pd.Period(datetime.strptime(x, '%m/%d/%Y %I:%M:%S %p'), 'D')
    except:
        try:
            #YYYY-MM-DD HH:MM:SS like 2377-07-23 00:00:00
            return pd.Period(datetime.strptime(x, '%Y-%m-%d %H:%M:%S'), 'D')
        except:
            return np.nan

df1_new['obs_date'] = df1_new['obs_date'].apply(str2time)

推荐阅读