python - 优雅高效的方式保留日期值,没有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')
是否有任何其他有效的方法来保留日期值,但仅通过更改格式?如果它可以是字符串列/数据类型,我很好
我希望我的输出如下所示。
更新的尝试/除屏幕截图
解决方案
您可以将值转换为日期时间,然后转换为日期,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)
推荐阅读
- sql - 在 nopcommerce 4.3 中将 nvarchar 值“abc”转换为数据类型 int 时转换失败
- c++ - 阅读消息最多 % 个字符
- python-3.x - 非文本数据的参差不齐的张量作为 LSTM 的输入
- c++ - 获取对 MemoryPool 的 typeinfo 的未定义引用,并且我的所有方法都已定义
- .net - sam build 错误 - 命令 'dotnet-lambda' 与来自另一个工具的现有命令冲突
- css - 如何让@mdi/fonts 显示图标
- amazon-web-services - AWS SNS 主题的 AWS SQS 订阅的访问控制
- json - 读取原始输入行并输出单个数组
- android - 如何在android中检测应用订阅中的用户取消或续订?
- c# - 初学者 c# - Windows 10、WPF、资源字典、上下文菜单和任务栏图标 - MenuItem 可见性问题