Python 优雅而高效的方式保持日期值不变,无OOB错误

Python 优雅而高效的方式保持日期值不变,无OOB错误,python,python-3.x,pandas,dataframe,datetime,Python,Python 3.x,Pandas,Dataframe,Datetime,我有一个数据帧,如下所示 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']}) 正如您所看到的,我的日期值中很少有超出范围的值

我有一个数据帧,如下所示

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']})

正如您所看到的,我的日期值中很少有超出范围的值。然而,我仍然希望保留它们。不幸的是,由于OOB的问题,我不能

我在下面试过了

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

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

我希望我的输出如下所示

更新了try/except屏幕截图


您可以将值转换为datetimes,然后再转换为day
Period
,仅适用于表示超限值的pandas格式

如果省略它,则使用python datetimes对象,而不是datetimes(时间戳)

如果可能,请选择多种格式:

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)

pandas以纳秒分辨率表示时间戳,可使用64位整数表示的时间跨度限制为大约584年。这意味着2377年和2277年的日期不能转换为datetime。尝试更改这些日期,它会起作用。实际上,我的真实数据有超过百万条这样的记录。这样做是为了取消识别原始日期。没有别的办法吗?使用字符串approachI的东西不能更改场景绑定的日期,而不是将它们作为日期时间。我必须使用任何日期值。检查我的解决方案。希望会help@anky_91-是的,现在使用这种数据不容易。他离开了一段时间meeting@SSMK-没问题;)我有个问题。它同时进入Try和Except块。只有在出现错误时,才应转到except块。我说得对吗?更新后的截图格式不同,所以我只更新了格式。我输入的日期值如下所示
2175-04-07 00:00:00
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)