对时间值字符串拆包.split()方法时出现值错误



我有下面的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,这是无法做到的。

您有几种选择来克服这个问题。

  1. 您可以以不同的方式格式化数据,并始终包含小时数,因此17:34->0:17:34
  2. 您可以在解析器中处理2个案例
values = i.split(':')
if len(values) == 2:
h = 0
m,s = values
else:
h,m,s = values
  1. 您可以使用regex,但我不建议使用它,因为它的可读性不如其他选项

如果字符串的长度是5乘以Series.maskSeries.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

最新更新