簡體   English   中英

如何根據時間戳的多個條件替換 NaN 值?

[英]How can I replace NaN values based on multiple conditions for timestamps?

我有以下 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 值:

如果結束日期與今天相同(在此示例中,今天 = 2022-12-12),我希望 NaN 值具有 datetime.now() 時間戳。

否則,如果結束日期不是今天,我希望 NaN 值與行的 df["Start"] 具有相同的日期,但時間為 23:59:59。

我嘗試使用 fillna function 並將 df[Start] 的日期與新時間結合起來,但我得到一個錯誤,因為 df[Start] 是一個系列而不是一個參數。 使用掩碼我可以 select 行,但我不想循環執行此操作。

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]

您可以使用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]')

Output :

                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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM