Python:转换h min-sec的行程持续时间,只留下分钟计数

2024-09-29 19:35:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我对python和编程还不熟悉(所以请放轻松点),希望有人能帮忙。 我的自行车旅行持续时间为dtype:object 持续时间 14小时26分2秒。 0小时8分34秒。 0小时12分17秒。

理想情况下,我希望创建一个新列,将计算的分钟持续时间作为整数保存。所以h需要60秒四舍五入。所以我会: 持续时间 866 9 12

我有困难,这是第一个障碍,分裂和获得数字。 我很高兴与你分手:

def ConvertDuration(Minutes):
    return Minutes.split(' ')[0].split('.')[1].strip()
WashBike['DurationMin'] = pd.DataFrame({'Duration':WashBike['Duration'].apply(ConvertDuration)})

我可以随意调整位置,并为h、min和sec创建一个列。 但是字符串字符将保留。我是否需要进行另一个拆分来进一步分离和删除字符?
我还试着用以下文字剥去人物:

^{pr2}$

我还没能达到将数值转换成一个数字分钟单位的阶段。我正在考虑做这样的事情:

WashBike['DurationMn'] = WashBike['Duration'].split(' ').apply(lambda x: int(x[0]) * 60 + int(x[1] + int(x[2].round()) ))

虽然我不能走到这一步。在

我已经花了2天的时间查看stackoverflow和其他的。我发现了很多关于日期时间等的信息。当我试图将持续时间转换为hh:mm:ss时,我不确定它是否正确。任何帮助和建议将不胜感激。在


Tags: 编程时间自行车数字字符intsplit持续时间
2条回答

这是直接的频率转换,参见here

In [16]: df = pd.DataFrame({'Duration': ['4h 26min. 2sec.',
                                        '0h 8min. 34sec.',
                                        '0h 12min. 17sec.']})

In [17]: df
Out[17]: 
           Duration
0   4h 26min. 2sec.
1   0h 8min. 34sec.
2  0h 12min. 17sec.

这些几乎都是标准的形式,只是简单的。在

^{pr2}$

以分钟为单位的浮动结果

In [19]: pd.to_timedelta(df.Duration.str.replace('\.','')) / np.timedelta64(1,'m')
Out[19]: 
0    266.033333
1      8.566667
2     12.283333
Name: Duration, dtype: float64

这会截断

In [20]: pd.to_timedelta(df.Duration.str.replace('\.','')).astype('timedelta64[m]')
Out[20]: 
0    266
1      8
2     12
Name: Duration, dtype: float64

这里有一种方法可以在不使用任何日期解析模块的情况下完成此操作。在

一个单行线-您可以通过regex和apply列上的apply提取数字,就像分割成多行以提高可读性

(df['Duration']
 .apply(lambda x: sum([a*int(b) 
                       for a,b in zip([60., 1., 1./60],
                                      re.findall(r'\d+', x))]))
)

实际上,对于像'4h 26min. 2sec.'这样的字符串,您首先会找到模式re.findall(r'\d+', x),也就是[4, 26, 2],现在用minutes[60., 1., 1./60]sum的值乘以这个模式。在

假设df是这样的

^{pr2}$

然后,可以提取分钟

In [9]: (df['Duration']
   ...:  .apply(lambda x: sum([a*int(b)
   ...:                        for a,b in zip([60., 1., 1./60],
   ...:                                       re.findall(r'\d+', x))]))
   ...: )
Out[9]:
0    266.033333
1      8.566667
2     12.283333
Name: Duration, dtype: float64

为了可读性起见,您还可以创建一个自定义函数minutes

def minutes(string):
    pattern = re.findall(r'\d+', string)
    minutes_mul =  [a*int(b) for a,b in zip([60., 1., 1./60], pattern)]
    return sum(minutes_mul)

然后涂上

df['Duration'].apply(minutes)

相关问题 更多 >

    热门问题