Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将pandas字符串列转换为datetime,其中局部缺少小时部分_Python_Pandas_Data Munging - Fatal编程技术网

Python 将pandas字符串列转换为datetime,其中局部缺少小时部分

Python 将pandas字符串列转换为datetime,其中局部缺少小时部分,python,pandas,data-munging,Python,Pandas,Data Munging,我把duration字符串记为'48M37s',有时记为'1H38M29s',还有一个字符串集合,它将此数据保存在pandas dataframe的列中 我正在尝试将duration列的数据类型转换为datetime,如下所示 pd.to_datetime(usg['duration'], format='%Hh %Mm %Ss') 但由于以下错误而失败 ValueError: time data '1h 38m 29s' does not match format '%Mm %Ss' (ma

我把duration字符串记为'48M37s',有时记为'1H38M29s',还有一个字符串集合,它将此数据保存在pandas dataframe的列中

我正在尝试将duration列的数据类型转换为datetime,如下所示

pd.to_datetime(usg['duration'], format='%Hh %Mm %Ss')
但由于以下错误而失败

ValueError: time data '1h 38m 29s' does not match format '%Mm %Ss' (match)
我知道有时duration列的列表条目中缺少hour部分,我想知道如果一种格式与另一种格式不匹配,是否有办法指定多种格式

这样做将产生如下输出,保留列中条目的顺序

     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


更好地使用:
pd.to_timedelta(usg['duration'])

给出输出:

0   00:48:37
1   01:38:29
Name: duration, dtype: timedelta64[ns]

这将在OP的示例数据上失败,也不要发布代码片段,因为这对其他人没有用处。您应该发布一个完整的代码示例,演示此操作是否适用于OPThis not fail。很抱歉,我的数据中缺少
s
,重点仍然是,请不要发布简短的代码片段,答案应完整,包含示例数据、代码和生成的输出,因为当前它看起来像一条注释
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]