我有一个如下所示的数据框
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']})
我不想使用pd.to_datetime
方法,因为它强加了年份限制(上限)。 OOB error here
下面是我尝试过的方法,但是效率不高,如下所示
yr = df1_new['obs_date'][0][5:9]
m = df1_new['obs_date'][0][2:4]
d = df1_new['obs_date'][0][0]
t = df1_new['obs_date'][0][11:19]
output = yr + "-" + m + "-" + d + " " + t
在不使用pd.datetime
函数的情况下,还有其他有效且优雅的方法来实现以下预期输出
更新的屏幕截图
尝试/除屏幕截图
答案 0 :(得分:1)
将字符串日期转换为日期时间,然后恢复为所需的格式。下面的示例:
from datetime import datetime
d = "7/23/2377 12:00:00 AM"
datetime.strptime(d, "%m/%d/%Y %I:%M:%S %p").strftime("%Y-%m-%d %H:%M:%S %p")
#output
>>>'2377-07-23 00:00:00 AM'
答案 1 :(得分:1)
from datetime import datetime
def convert_func(x):
return datetime.strptime(x, "%m/%d/%Y %I:%M:%S %p").strftime("%Y-%m-%d %H:%M:%S")
df1_new['obs_date'] = df1_new['obs_date'].astype(str)
df1_new['obs_date'] = df1_new['obs_date'].apply(convert_func)
这应该有效
答案 2 :(得分:1)
在将字符串转换为日期时间时应用try catch
import datetime
import pandas as pd
def str2time(x):
try:
return datetime.datetime.strptime(x, '%m/%d/%Y %I:%M:%S %p')
except:
return pd.NaT
df1_new['obs_date'] = df1_new['obs_date'].apply(str2time)
print(df1_new)
person_id obs_date
0 1 2377-07-23 12:00:00
1 1 NaT
2 3 NaT
3 3 2277-07-27 12:00:00
4 5 2077-07-13 12:00:00
5 5 NaT