2015-09-09 6 views
1

Я хочу преобразовать 5-минутные интервалы - целые числа - в формат времени.Pandas: конвертировать временные интервалы целых чисел в раз

Например, ниже, 0 интервал должен стать 00:00, интервал 5 должен стать 00:05 и т.д.

date  interval 
2012-10-01 0 
2012-10-01 5 
2012-10-01 10 
2012-10-01 15 
2012-10-01 20 
2012-10-01 25 
2012-10-01 30 
2012-10-01 35 
2012-10-01 40 

Я думал, что следующее будет работать:

df['interval'] = pd.to_datetime(df['interval'], format='%H:%M').dt.hour

Но он возвращает эту ошибку:

time data 0 does not match format '%H:%M' (match)

Это логично, но оставляет меня неясным, как отформатировать аргумент формата to.datetime. Я ничего не вижу в pandas documentation, который помогает.


Update

К сожалению, я не могу получить любой из них, чтобы работать с моим фактическим DataFrame. Я должен добавить дополнительную информацию о том, что переменная interval работает от 0 до 2355 снова и снова. Переменная имеет 17 568 строк значений от 0 до 2355.

@padraig с обеих ваших ответов я получаю эту ошибку:

ValueError: hour must be in 0..23

+0

Непонятно из вашего примера, что ваш интервал был форматом HHMM. Я пересмотрел свое решение, чтобы оно работало с вашими данными. – Alexander

ответ

1

Хотя вы просили время, вы, вероятно, лучше с Pandas timestamp, который записывает дату и время.

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

df['hour'] = df.interval // 100 
df['mins'] = df.interval.apply(lambda interval: interval % 100) 

Теперь вы можете создать метку времени, возможно с временной зоны (например,UTC):

from pytz import UTC 

df['timestamp'] = df.apply(lambda row: pd.Timestamp('{0} {1}:{2}'.format(row.date, row.hour, row.mins), tz=UTC), axis=1) 

>>> df 
     date interval hour mins   timestamp 
0 2012-10-01   0  0  0 2012-10-01 00:00:00 
1 2012-10-01   5  0  5 2012-10-01 00:05:00 
2 2012-10-01  10  0 10 2012-10-01 00:10:00 
3 2012-10-01  15  0 15 2012-10-01 00:15:00 
4 2012-10-01  20  0 20 2012-10-01 00:20:00 
5 2012-10-01  25  0 25 2012-10-01 00:25:00 
6 2012-10-01  30  0 30 2012-10-01 00:30:00 
7 2012-10-01  35  0 35 2012-10-01 00:35:00 
8 2012-10-01  40  0 40 2012-10-01 00:40:00 

Учитывая временной метки, вы можете получить доступ к другим properties, например, время следующим образом:

>>> df.timestamp[5].time() 
datetime.time(0, 25) 

Если вы действительно хотите время как отдельный столбец (отформатированные как текст, но необязательно любой другой желаемый формат времени):

df['time'] = df.timestamp.apply(lambda time: time.strftime('%H:%M')) 

>>> df 
     date interval hour mins     timestamp time 
0 2012-10-01   0  0  0 2012-10-01 00:00:00+00:00 00:00 
1 2012-10-01   5  0  5 2012-10-01 00:05:00+00:00 00:05 
2 2012-10-01  10  0 10 2012-10-01 00:10:00+00:00 00:10 
3 2012-10-01  15  0 15 2012-10-01 00:15:00+00:00 00:15 
4 2012-10-01  20  0 20 2012-10-01 00:20:00+00:00 00:20 
5 2012-10-01  25  0 25 2012-10-01 00:25:00+00:00 00:25 
6 2012-10-01  30  0 30 2012-10-01 00:30:00+00:00 00:30 
7 2012-10-01  35  0 35 2012-10-01 00:35:00+00:00 00:35 
8 2012-10-01  40  0 40 2012-10-01 00:40:00+00:00 00:40 
+0

Alexander и все остальные: в итоге этот ответ лучше всего работал с моими данными и был полезен в предоставлении дополнительных метрик времени. – RDJ

2
from datetime import time 
import pandas as pd 
def to_time(x): 
    hours, mn = divmod(x,60) 
    return time(hours,mn) 

df["interval"] = df["interval"].apply(to_time) 

Выход:

  date interval 
0 2012-10-01 00:00:00 
1 2012-10-01 00:05:00 
2 2012-10-01 00:10:00 
3 2012-10-01 00:15:00 
4 2012-10-01 00:20:00 
5 2012-10-01 00:25:00 
6 2012-10-01 00:30:00 
7 2012-10-01 00:35:00 
8 2012-10-01 00:40:00 

Или с read_csv и только увеличивающиеся часы:

from datetime import time 
import pandas as pd 
def to_time(x): 
    hours, mn = divmod(int(x), 60) 
    return "{:02}:{:02}".format(hours, mn) 
df = pd.read_csv("test.csv", date_parser=to_time, parse_dates=["interval"]) 
print(df) 

Что, если мы изменим последний «интервал» для 2355 выходов:

  date interval 
0 2012-10-01 00:00 
1 2012-10-01 00:05 
2 2012-10-01 00:10 
3 2012-10-01 00:15 
4 2012-10-01 00:20 
5 2012-10-01 00:25 
6 2012-10-01 00:30 
7 2012-10-01 00:35 
8 2012-10-01 39:15 
+0

@padraig Это замечательно, но не работали с моими фактическими данными, это моя вина. Я обновил вопрос, чтобы выяснить проблему. – RDJ

+0

@ Джонатан, хорошо, так что вы просто хотите увеличить час и минуты, или мы будем принимать дни и т. Д., Во внимание? Попробуйте отредактировать и посмотрите, находимся ли мы на одной странице, если нет, нам нужно будет использовать datetime –

2

Просто отформатировать его в виде строки.

Метод 1 (с использованием старого стиля):

"%02d:%02d" % (int(interval/60), interval % 60) 

Способ 2 (с использованием более новый стиль):

"{:02d}:{:02d}".format(int(interval/60), interval % 60) 

 Смежные вопросы

  • Нет связанных вопросов^_^