在忽略(或保留)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:ss
到 datatime.time
和 timedelta
的分钟数,但我仍然没有专栏(系列或 DF) 以分钟为单位的所有值,同时保持 NaN ...
您可以使用 pd.to_timedelta
将 delay
列转换为 pandas timedelta 系列,然后将其除以 1 min
的 Timedelta
以获得总分钟数:
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
我想将包含此格式值的 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:ss
到 datatime.time
和 timedelta
的分钟数,但我仍然没有专栏(系列或 DF) 以分钟为单位的所有值,同时保持 NaN ...
您可以使用 pd.to_timedelta
将 delay
列转换为 pandas timedelta 系列,然后将其除以 1 min
的 Timedelta
以获得总分钟数:
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