pandas 如何基于时间戳的多个条件替换NaN值?

w1jd8yoj  于 2022-12-16  发布在  其他
关注(0)|答案(1)|浏览(136)

我有以下 Dataframe :

import pandas as pd
from datetime import datetime

df = pd.DataFrame({'Start':['2022-12-07 06:24:48','2022-12-08 14:37:16','2022-12-09 08:00:59','2022-12-12 09:31:23','2022-12-12 11:11:17'],
'End':['2022-12-07 10:07:00','2022-12-08 17:51:21', 'NaN', 'NaN', 'NaN']})

df['Start'] = pd.to_datetime(df['Start'])
df['End'] = pd.to_datetime(df['End'])

如何根据以下条件替换NaN值:
如果End Date与today相同(在本例中today = 2022-12-12),我希望NaN值为datetime.now()时间戳。
否则,如果结束日期不是今天,我希望NaN值的日期与行的df[“Start”]相同,但时间为23:59:59。
我尝试用fillna函数将df[Start]的日期与一个新的时间组合起来,但是我得到了一个错误,因为df[Start]是一个Series而不是一个参数。使用掩码我可以选择行,但是我不想在循环中这样做。

df['End'].fillna(datetime.combine(df['Start'].dt.date,datetime.max.time()))

mask_td = (df["Start"].dt.date == datetime.today().date()) & (df["End"].isnull())
mask_ntd = (df["Start"].dt.date != datetime.today().date()) & (df["End"].isnull())

df["End"].loc[mask_td]
de90aj5v

de90aj5v1#

您可以使用**numpy.select:**

import numpy as np
condlist=[df['End'].isnull() & (df["Start"].dt.date == datetime.today().date()),
                    df['End'].isnull() & (df["Start"].dt.date != datetime.today().date())]

choicelist=[datetime.now(),df['Start'].dt.strftime('%Y-%m-%d 23:59:59')]

default=df['End'].astype(str)

df['End']=np.select(condlist,choicelist,default)
df['End'] = df['End'].astype('datetime64[s]')

输出

Start                 End
0 2022-12-07 06:24:48 2022-12-07 10:07:00
1 2022-12-08 14:37:16 2022-12-08 17:51:21
2 2022-12-09 08:00:59 2022-12-09 23:59:59
3 2022-12-12 09:31:23 2022-12-12 14:29:21
4 2022-12-12 11:11:17 2022-12-12 14:29:21

相关问题