在忽略(或保留)NaN 的同时更改列格式

Change a column format while ignoring (or keeping) NaN

我想将包含此格式值的 DataFrame 的列更改为 hh:mm:ss 包含分钟数的列(同时保留 NaN 值)

我无法直接从 excel 文件中更改它,所以我尝试使用 pandas 进行更改(我正在使用带有健康数据库的 ML 模型):

38      00:35:00
39      00:50:00
40      00:45:00
41      01:32:00
42      00:29:00
43           NaN
44      00:45:00
45      00:13:00
46      00:20:00
47      00:31:00
48      00:54:00
49      00:43:00
50      02:33:00

我尝试使用掩码将值与 NaN 值分开,然后使用 str.split()

转换为分钟
df1 = df['delay'][df['delay'].notnull()].astype(str).str.split(':').apply(lambda x: int(x[0]) * 60 + int(x[1]))```
df2 = df['delai_ponc_recal_calc'][df['delai_ponc_recal_calc'].isnull()]

但是我不能在不丢失顺序的情况下合并到两个系列(我在合并系列的末尾得到具有正确索引的 NaN 值)

39        50
40        45
41        92
42        29
44        45
45        13
46        20
47        31
48        54
49        43
50       153
43       NaN

我还尝试使用循环(不使用掩码)从 hh:mm:ssdatatime.timetimedelta 的分钟数,但我仍然没有专栏(系列或 DF) 以分钟为单位的所有值,同时保持 NaN ...

您可以使用 pd.to_timedeltadelay 列转换为 pandas timedelta 系列,然后将其除以 1 minTimedelta 以获得总分钟数:

pd.to_timedelta(df['delay'], errors='coerce') / pd.Timedelta(1, 'min')

39     50.0
40     45.0
41     92.0
42     29.0
43      NaN
44     45.0
45     13.0
46     20.0
47     31.0
48     54.0
49     43.0
50    153.0
Name: delay, dtype: float64

以下是一些可能的解决方案:

输入:

       delay
38  00:35:00
39  00:50:00
40  00:45:00
41  01:32:00
42  00:29:00
43       NaN
44  00:45:00
45  00:13:00
46  00:20:00
47  00:31:00
48  00:54:00
49  00:43:00
50  02:33:00

方法一:pd.to_datetime+map

df['delay'] = pd.to_datetime(df['delay'])

#using lambda function 
df['delay2'] = df['delay'].map(lambda x : x.hour*60 + x.minute)

print(df['delay2'])
#df.drop(['delay'],axis=1,inplace=True) 

方法二:pd.to_datetime+dt

#converts time columns to pandas datetime64ns format
df['delay'] = pd.to_datetime(df['delay']) 

#using dt to extract hour and minute data
df['delay2'] = df['delay'].dt.hour*60 + df['delay'].dt.minute 
print(df['delay2'])

输出:

39     50.0
40     45.0
41     92.0
42     29.0
43      NaN
44     45.0
45     13.0
46     20.0
47     31.0
48     54.0
49     43.0
50    153.0
Name: Time, dtype: float64