我有下面的array Object
,它本质上是以小时、分钟和秒为单位的时间。我想将此对象转换为分钟,但遇到错误。该错误似乎是由于拆包.split
方法结果时字符串长度不同所致。有什么建议吗?
df6['Chip Time']
0 16:42
1 17:34
2 18:13
3 18:32
4 19:12
...
1453 1:35:08
1454 1:43:41
1455 1:45:36
1456 1:45:40
1457 1:48:13
Name: Chip Time, Length: 1458, dtype: object
time_list = df6['Chip Time'].tolist()
# You can use a for loop to convert 'Chip Time' to minutes
time_mins = []
for i in time_list:
h,m,s = i.split(':')
math = (int(h)*3600+int(m)*60+int(s))/60
time_mins.append(math)
print(time_mins)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-52-ac7d4ab91169> in <module>
3 time_mins = []
4 for i in time_list:
----> 5 h,m,s = i.split(':')
6 math = (int(h)*3600+int(m)*60+int(s))/60
7 time_mins.append(math)
ValueError: not enough values to unpack (expected 3, got 2)
看一下前几行。比方说第二排17:34
。当你拆分它时就会发生这种情况。
In [1]: "17:34".split(":")
Out[1]: ['17', '34']
正如您所看到的,只有2个值,因为您只有一个:
,并且您正试图将其解压缩为3个变量h,m,s
,这是无法做到的。
您有几种选择来克服这个问题。
- 您可以以不同的方式格式化数据,并始终包含小时数,因此
17:34
->0:17:34
- 您可以在解析器中处理2个案例
values = i.split(':')
if len(values) == 2:
h = 0
m,s = values
else:
h,m,s = values
- 您可以使用regex,但我不建议使用它,因为它的可读性不如其他选项
如果字符串的长度是5
乘以Series.mask
和Series.str.len
,则可以添加0:
,然后通过to_timedelta
将列转换为时间增量,通过Series.dt.total_seconds
获得秒,并将60
:除
s = df6['Chip Time'].mask(df6['Chip Time'].str.len().eq(5), '0:' + df6['Chip Time'])
df6['min'] = pd.to_timedelta(s).dt.total_seconds() / 60
print (df6)
Chip Time min
0 16:42 16.700000
1 17:34 17.566667
2 18:13 18.216667
3 18:32 18.533333
4 19:12 19.200000
1453 1:35:08 95.133333
1454 1:43:41 103.683333
1455 1:45:36 105.600000
1456 1:45:40 105.666667
1457 1:48:13 108.216667
详细信息:
print (s)
0 0:16:42
1 0:17:34
2 0:18:13
3 0:18:32
4 0:19:12
1453 1:35:08
1454 1:43:41
1455 1:45:36
1456 1:45:40
1457 1:48:13
Name: Chip Time, dtype: object
使用这个答案中的一点输入,您还可以获得作为的时间戳的总秒数
def timestring_to_seconds(ts, sep=':'):
return sum(x * int(t) for x, t in zip((1,60,3600), reversed(ts.split(sep))))
ts = '00:04:23'
print(timestring_to_seconds(ts))
# 263
ts = '04:23'
print(timestring_to_seconds(ts))
# 263
ts = '23'
print(timestring_to_seconds(ts))
# 23
请注意,即使时间字符串中只提供了秒(没有分钟或小时(,这也可以工作。当然,如果您需要分钟数,也可以包含/ 60
。您可以将函数映射到df
列:
import pandas as pd
df = pd.DataFrame({'Chip Time': ['00:04:23', '04:23', '23']})
df['s'] = df['Chip Time'].map(timestring_to_seconds)
# df
# Chip Time s
# 0 00:04:23 263
# 1 04:23 263
# 2 23 23