解压缩时间值字符串的.split()方法时出现值错误

2024-04-23 21:45:06 发布

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

我有下面的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)

Tags: toinfortime错误mathlistint
3条回答

请看前几行。让我们说第二排17:34。这就是当你分割它时会发生的事情

In [1]: "17:34".split(":")
Out[1]: ['17', '34']

正如您所看到的,只有2个值,因为您只有一个:,并且您正试图将其解压为3个变量h,m,s,这是无法做到的

您有几个选项来克服这个问题

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

如果strin的长度为5乘以^{}^{},则可以将0:添加到5,然后将connvert列除以^{},将秒数除以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

使用来自this answer的少量输入,还可以获得时间戳的总秒数,如下所示:

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

相关问题 更多 >