Python: 转换 h min sec 的行程持续时间并仅保留分钟计数
Python: converting Trip duration of h min sec and leave only minute count
我是 python 和编程的新手(所以请放轻松),希望有人能提供帮助。
我的自行车旅行持续时间为 dtype: object
时长
14 小时 26 分钟。 2秒。
0 小时 8 分钟。 34 秒。
0 小时 12 分钟。 17秒
理想情况下,我想创建一个新列,将计算的分钟持续时间保存为整数。所以 h 需要 *60,秒数 rounded.So 我会:
时长
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 天时间浏览 Whosebug 和其他软件。我发现了很多关于日期时间等的信息。虽然我试图将 Duration 转换为 hh:mm:ss,但我不确定它是否正确。非常感谢任何帮助和建议。
肯
这是一种不使用任何日期解析模块的方法。
单行 - 您可以通过正则表达式和 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)
这是简单的变频,见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 .
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
我是 python 和编程的新手(所以请放轻松),希望有人能提供帮助。 我的自行车旅行持续时间为 dtype: object 时长 14 小时 26 分钟。 2秒。 0 小时 8 分钟。 34 秒。 0 小时 12 分钟。 17秒
理想情况下,我想创建一个新列,将计算的分钟持续时间保存为整数。所以 h 需要 *60,秒数 rounded.So 我会: 时长 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 天时间浏览 Whosebug 和其他软件。我发现了很多关于日期时间等的信息。虽然我试图将 Duration 转换为 hh:mm:ss,但我不确定它是否正确。非常感谢任何帮助和建议。
肯
这是一种不使用任何日期解析模块的方法。
单行 - 您可以通过正则表达式和 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)
这是简单的变频,见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 .
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