将 pandas 字符串列转换为偶尔缺少小时部分的日期时间
Converting pandas strings column to datetime with ocassionally missing hour part
我将持续时间字符串标记为“48m 37s”,有时标记为“1h 38m 29s”,并在 pandas 数据框的列
中保存此数据的字符串集合
我正在尝试将持续时间列的数据类型转换为日期时间,如下所示
pd.to_datetime(usg['duration'], format='%Hh %Mm %Ss')
但因以下错误而失败
ValueError: time data '1h 38m 29s' does not match format '%Mm %Ss' (match)
我知道有时持续时间列的列表条目中会缺少小时部分,我想知道是否有一种方法可以指定多种格式,以防万一匹配失败。
这样做会产生如下输出,保留列中条目的顺序
00:39:40
01:38:29
07:39:40
你需要:
usg = pd.DataFrame({'duration':['7h 39m 40s','15h 39m 40s','39m 40s']})
print (usg)
usg['duration'] = np.where(usg.duration.str.contains('h'),
pd.to_datetime(usg['duration'], format='%Hh %Mm %Ss', errors='coerce'),
pd.to_datetime(usg['duration'], format='%Mm %Ss',errors='coerce'))
print (usg)
duration
0 1900-01-01 07:39:40
1 1900-01-01 15:39:40
2 1900-01-01 00:39:40
另一个解决方案:
usg['duration'] = pd.to_datetime(usg['duration'].where(usg.duration.str.contains('h'),
'0h '+ usg['duration']),format='%Hh %Mm %Ss')
print (usg)
duration
0 1900-01-01 07:39:40
1 1900-01-01 15:39:40
2 1900-01-01 00:39:40
usg.loc[~usg.duration.str.contains('h'), 'duration'] = '0h '+ usg['duration']
usg['duration'] = pd.to_datetime(usg['duration'], format='%Hh %Mm %Ss')
print (usg)
duration
0 1900-01-01 07:39:40
1 1900-01-01 15:39:40
2 1900-01-01 00:39:40
更好用:pd.to_timedelta(usg['duration'])
usg = pd.DataFrame({'duration': ['48m 37s', '1h 38m 29s']})
pd.to_timedelta(usg['duration'])
给出输出:
0 00:48:37
1 01:38:29
Name: duration, dtype: timedelta64[ns]
我将持续时间字符串标记为“48m 37s”,有时标记为“1h 38m 29s”,并在 pandas 数据框的列
中保存此数据的字符串集合我正在尝试将持续时间列的数据类型转换为日期时间,如下所示
pd.to_datetime(usg['duration'], format='%Hh %Mm %Ss')
但因以下错误而失败
ValueError: time data '1h 38m 29s' does not match format '%Mm %Ss' (match)
我知道有时持续时间列的列表条目中会缺少小时部分,我想知道是否有一种方法可以指定多种格式,以防万一匹配失败。
这样做会产生如下输出,保留列中条目的顺序
00:39:40
01:38:29
07:39:40
你需要:
usg = pd.DataFrame({'duration':['7h 39m 40s','15h 39m 40s','39m 40s']})
print (usg)
usg['duration'] = np.where(usg.duration.str.contains('h'),
pd.to_datetime(usg['duration'], format='%Hh %Mm %Ss', errors='coerce'),
pd.to_datetime(usg['duration'], format='%Mm %Ss',errors='coerce'))
print (usg)
duration
0 1900-01-01 07:39:40
1 1900-01-01 15:39:40
2 1900-01-01 00:39:40
另一个解决方案:
usg['duration'] = pd.to_datetime(usg['duration'].where(usg.duration.str.contains('h'),
'0h '+ usg['duration']),format='%Hh %Mm %Ss')
print (usg)
duration
0 1900-01-01 07:39:40
1 1900-01-01 15:39:40
2 1900-01-01 00:39:40
usg.loc[~usg.duration.str.contains('h'), 'duration'] = '0h '+ usg['duration']
usg['duration'] = pd.to_datetime(usg['duration'], format='%Hh %Mm %Ss')
print (usg)
duration
0 1900-01-01 07:39:40
1 1900-01-01 15:39:40
2 1900-01-01 00:39:40
更好用:pd.to_timedelta(usg['duration'])
usg = pd.DataFrame({'duration': ['48m 37s', '1h 38m 29s']})
pd.to_timedelta(usg['duration'])
给出输出:
0 00:48:37
1 01:38:29
Name: duration, dtype: timedelta64[ns]