Ошибка значения при распаковке метода .split () для строки значений времени - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть ниже 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)

Ответы [ 3 ]

2 голосов
/ 29 апреля 2020

Посмотрите на первые несколько строк. Допустим, 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 голос
/ 29 апреля 2020

, используя немного ввода этого ответа , вы также можете получить общее количество секунд ваших временных отметок как

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
1 голос
/ 29 апреля 2020

Вы можете добавить 0:, если длина строк равна 5 на Series.mask и Series.str.len, затем преобразовать столбец в timedeltas на 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...