Python 熊猫:从另一列填充混合日期时间字段
我有一个datetime列,其中偶尔缺少日期信息。它只包含小时信息Python 熊猫:从另一列填充混合日期时间字段,python,pandas,datetime,Python,Pandas,Datetime,我有一个datetime列,其中偶尔缺少日期信息。它只包含小时信息 Entry Init Edit 14 1666832 10.10.2002 02:10 10.10.2002 02:10 15 1675384 13.10.2002 13:49 13.10.2002 13:49 16 1709573 25.10.2002 14:21 14:23 17 1740242
Entry Init Edit
14 1666832 10.10.2002 02:10 10.10.2002 02:10
15 1675384 13.10.2002 13:49 13.10.2002 13:49
16 1709573 25.10.2002 14:21 14:23
17 1740242 03.11.2002 21:08 03.11.2002 21:08
18 1751053 05.11.2002 10:46 05.11.2002 10:46
如果“编辑”仅显示小时信息,我想将日期信息添加到“编辑”列中,其中包含“初始化”字段中的日期。我编写了一个函数并将其应用于相关字段
def edit(x,y):
if len(y) < 16:
y = f"{x.split(' ')[0]} {y}"
return y
df["EditDate_proper"] = df.apply(lambda x: edit(x['Init'], x['Edit']), axis=1)
def编辑(x,y):
如果len(y)<16:
y=f“{x.split(“”)[0]}{y}”
返回y
df[“EditDate_property”]=df.apply(lambda x:edit(x['Init'],x['edit']),axis=1)
它工作正常,但我想知道是否有一种更聪明的方法来填充格式错误的值,类似于“fillna”方法。例如,“如果此字段不包含%d.%m.%Y%H:%m种格式,请从此字段的%d.%m.%Y信息中获取”
提前谢谢
我想知道是否有一种更聪明的方法来填充格式错误的值,类似于“fillna”方法
可以通过和将值转换为日期时间和时间增量
使用errors='concurve'
因此,如果没有匹配项,则获取缺少的值,通过删除时间,添加到时间增量,最后用转换为日期时间的原始值替换缺少的值:
df['Init'] = pd.to_datetime(df['Init'], errors='coerce')
timedeltas = pd.to_timedelta(df['Edit'] + ':00', errors='coerce')
edit_dates = pd.to_datetime(df['Edit'], errors='coerce')
df["EditDate_proper"] = (timedeltas + df['Init'].dt.floor('d')).fillna(edit_dates)
print (df)
Entry Init Edit EditDate_proper
14 1666832 2002-10-10 02:10:00 10.10.2002 02:10 2002-10-10 02:10:00
15 1675384 2002-10-13 13:49:00 13.10.2002 13:49 2002-10-13 13:49:00
16 1709573 2002-10-25 14:21:00 14:23 2002-10-25 14:23:00
17 1740242 2002-03-11 21:08:00 03.11.2002 21:08 2002-03-11 21:08:00
18 1751053 2002-05-11 10:46:00 05.11.2002 10:46 2002-05-11 10:46:00
如果要使用字符串:
m = df['Edit'].str.len() < 16
df["EditDate_proper"] = df['Init'].mask(m, df['Init'].str.split().str[0] + ' ' + df['Edit'])
print (df)
Entry Init Edit EditDate_proper
14 1666832 10.10.2002 02:10 10.10.2002 02:10 10.10.2002 02:10
15 1675384 13.10.2002 13:49 13.10.2002 13:49 13.10.2002 13:49
16 1709573 25.10.2002 14:21 14:23 25.10.2002 14:23
17 1740242 03.11.2002 21:08 03.11.2002 21:08 03.11.2002 21:08
18 1751053 05.11.2002 10:46 05.11.2002 10:46 05.11.2002 10:46
m=df['Edit'].str.len()<16
df[“EditDate_property”]=df['Init'].mask(m,df['Init'].str.split().str[0]+''+df['Edit']))
打印(df)
条目初始编辑编辑日期\u正确
14 1666832 10.10.2002 02:10 10.10.2002 02:10 10.10.2002 02:10
15 1675384 13.10.2002 13:49 13.10.2002 13:49 13.10.2002 13:49
16 1709573 25.10.2002 14:21 14:23 25.10.2002 14:23
17 1740242 03.11.2002 21:08 03.11.2002 21:08 03.11.2002 21:08
18 1751053 05.11.2002 10:46 05.11.2002 10:46 05.11.2002 10:46
我的第一次尝试实际上是使用errors='concurve'参数将其转换为datetime对象。然后我意识到我不能像处理字符串版本那样处理“NaT”值。你提出的两种方法似乎都很有效,非常感谢。