Python:转换h min sec的Trip持续时间并仅保留分钟计数

时间:2015-04-30 19:58:45

标签: python numpy time pandas duration

我是python和编程的新手(所以请轻松一点)并希望有人可以提供帮助。 我的自行车旅行时间为dtype:object     持续时间 14小时26分钟。 2秒。 0小时8分钟。 34sec。 0小时12分钟17sec。

我希望创建一个新的列,将计算的分钟持续时间保持为整数。所以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分别创建一列。 但是字符串字符将保留。我是否需要进行另一次拆分以进一步分离和删除字符呢? 我还尝试用以下内容删除字符:

WashBike['DurationInt'] = WashBike['Duration'].str.strip(' ').str.strip('.').str.strip('hHmMiInNsSeEcC')

我无法进入将数值放入单个数字分钟单位测量的阶段。我想做这样的事情:

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

虽然我无法做到这一点。

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

2 个答案:

答案 0 :(得分:3)

这是简单的频率转换,请参阅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.

这几乎是标准形式,只是zonk the。

In [18]: pd.to_timedelta(df.Duration.str.replace('\.',''))                        
Out[18]: 
0   04:26:02
1   00:08:34
2   00:12:17
Name: Duration, dtype: timedelta64[ns]

以分钟为单位的浮动结果

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

答案 1 :(得分:2)

这是一种不使用任何日期解析模块的方法。

单行 - 您可以从{regex}和apply列上的duration中提取数字,例如拆分为多行以提高可读性

(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]现在多次使用分钟[60., 1., 1./60]sum值。

让我们说df就像

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

然后,可以像

一样提取分钟
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)