2016-06-23 2 views
0

Я пытаюсь преобразовать эти строки чисел в формат «hh: mm: ss». Струны все разной длины, вот некоторые из них:Строки форматирования времени в Python

(212812, 218654, 232527, 235959, 0, 181240, 25959, 153834) 

Так что я хочу, чтобы включить вышеуказанные цифры в этом:

(21:28:12, 21:86:54, 23:25:27, 23:59:59, 00:00:00, 18:12:40, 2:59:59, 15:38:34) 

Я в основном возникают проблемы с получением их все же длины , например, с 0:00 до 00:00:00.

Спасибо!

+0

Поскольку вы составляете (или кого-то, кого знаете), свой собственный формат сериализации времени, возможно, вы могли бы объяснить это нам, если мы хотим помочь вам десериализировать его? В какое время '1234'? –

+0

Почему '0' становится' 00: 00: 00', но '25959' только становится' 2: 59: 59', а не '02: 59: 59'? – Nicarus

ответ

2

Как уже указывалось в комментариях, неясно, какой правильный ответ для некоторых входов (например, 1234, который мой код будет указывать 00:12:34). Я также решил, что 02:59:59 - лучший ответ, чем 2:59:59, учитывая желание получить 00:00:00.

Так вот мой код, который касается всех вышеуказанных входов корректно, по модулю изменение 2:59:59 Я выбрал:

import re 

def convert(numeric_time): 
    return ':'.join(re.findall('..', str(numeric_time).zfill(6))) 

times = (212812, 218654, 232527, 235959, 0, 181240, 25959, 153834) 
correct_answers = ['21:28:12', '21:86:54', '23:25:27', '23:59:59', '00:00:00', '18:12:40', '02:59:59', '15:38:34'] 

answers = map(convert, times) 
for answer, correct_answer in zip(answers, correct_answers): 
    assert answer == correct_answer, '{} != {}'.format(answer, correct_answer) 

UPDATE

С некоторых людей объект к регулярному выражению, вот аналогичная версия, которая не полагается на него:

def convert(numeric_time): 
    padded_time = str(numeric_time).zfill(6) 
    return ':'.join(padded_time[i:i+2] for i in range(0, len(padded_time), 2)) 
1

Ну так как мы придумав ответы здесь это «решение», которое не использует регулярные выражения:

In [3]: def weird_time_format(fmt): 
    ...:  fmt = str(fmt) 
    ...:  hours = fmt[:2].ljust(2, '0') 
    ...:  mins = fmt[2:4].ljust(2, '0') 
    ...:  secs = fmt[4:6].ljust(2, '0') 
    ...:  return ':'.join((hours, mins, secs)) 
    ...: 

In [4]: weird_time_format(212812) 
Out[4]: '21:28:12' 

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

In [1]: ''[1:2] 
Out[1]: '' 

In [2]: ''[1:2].ljust(2, '0') 
Out[2]: '00' 

Вот результаты для вашего примера ввода:

In [5]: example_input = (212812, 218654, 232527, 235959, 0, 181240, 25959, 153834) 

In [6]: tuple(map(weird_time_format, example_input)) 
Out[6]: 
('21:28:12', 
'21:86:54', 
'23:25:27', 
'23:59:59', 
'00:00:00', 
'18:12:40', 
'25:95:90', 
'15:38:34') 

И так как я принес его, что d OES к 1234:

In [7]: weird_time_format(1234) 
Out[7]: '12:34:00' 

ОК, я чувствовал (немного) плохо для остроумен. Если вы действительно заинтересованы в таком подходе, это будет работать лучше и больше в соответствии с выходом на другой ответ в:

In [3]: def weird_time_format(fmt): 
    ...:  fmt = str(fmt).rjust(6, '0') 
    ...:  return ':'.join((fmt[:2], fmt[2:4], fmt[4:6])) 
+0

На какое время? «Через 95 минут мои часы». –

+0

Зачем вы пишете нули справа, а не слева? – Nicarus

+0

Потому что тогда вы получаете удовольствие, например, '25: 95: 90', чтобы согласиться с примером« 21: 86: 54 ». –

0

Вот еще одна попытка.

Основная концепция заключается в добавлении 0, если длина строки ввода меньше 6.

a = (212812, 218654, 232527, 235959, 0, 181240, 25959, 153834) 
input_list = map(str,a) 
for input in input_list: 
    if len(input) != 6: 
     input = ''.join(['0' for i in range((6 - len(input)))]+list(input)) 
    print ':'.join([input[i:i+chunk_size] for i in range(0,len(input),len(input)/3)]) 

Результата

21:28:12 
21:86:54 
23:25:27 
23:59:59 
00:00:00 
18:12:40 
02:59:59 
15:38:34 
0

Надеется, что это помогает:

data = (212812, 218654, 232527, 235959, 0, 181240, 25959, 153834) 
time = map(str, data) #int to string 


def conv(time_array): 
    for t in time_array: 
     if(len(t) != 6): 
      t = str(t.zfill(6)) #filling 0's if less than 6 
     print ':'.join(t[i:i + 2] for i in range(0, len(t), 2)) #adding ':' 

conv(time) 

OUTPUT Использование некоторых тестовых данных

test = (1234, 23, 133, 6) 
00:12:34 
00:00:23 
00:01:33 
00:00:06 
Смежные вопросы