Объединить временной интервал в отдельные даты - PullRequest
0 голосов
/ 03 октября 2018

У меня есть пандас с двумя столбцами временных отметок начало и конец

    start                      end
2014-08-28 17:00:00 | 2014-08-29 22:00:00
2014-08-29 10:45:00 | 2014-09-01 17:00:00
2014-09-01 15:00:00 | 2014-09-01 19:00:00

Намерениеагрегировать количество часов, которые были зарегистрированы на данную дату.Так что в случае моего примера.

Я бы создавал диапазон дат и увеличивал количество часов по нескольким записям.

2014-08-28 -> 7 hrs
2014-08-29 -> 10 hrs + 1 hr 15 min => 11 hrs 15 mins
2014-08-30 -> 24 hrs
2014-08-31 -> 24 hrs
2014-09-01 -> 17 hrs + 6 hrs => 23 hrs

Я пытался использовать timedelta, но она делится только в абсолютных часах, а не на день.

Я также пытался разбить строки (т.е. разбить строкуна дневной основе, но я мог заставить его работать только на уровне даты, а не на уровне отметки времени)

Любые предложения приветствуются.

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

вы можете использовать pd.date_range для создания minute to minute interval каждого потраченного дня, после чего вы можете подсчитать потраченные минуты и преобразовать их в дельту времени

start   end
0   2014-08-28 17:00:00 2014-08-29 22:00:00
1   2014-08-29 10:45:00 2014-09-01 17:00:00
2   2014-09-01 15:00:00 2014-09-01 19:00:00


#Creating the minute to minute time intervals from start to end date of each line and creating as one series of dates 
a = pd.Series(sum(df.apply(lambda x: pd.date_range(x['start'],x['end'],freq='min').tolist(),1).tolist(),[])).dt.date
# Counting the each mintue intervals and converting to time stamps
a.value_counts().apply(lambda x: pd.to_timedelta(x,'m'))

Out:

2014-08-29   1 days 11:16:00
2014-08-30   1 days 00:00:00
2014-08-31   1 days 00:00:00
2014-09-01   0 days 21:02:00
2014-08-28   0 days 07:00:00
dtype: timedelta64[ns]
0 голосов
/ 03 октября 2018

Надеюсь, это будет полезно.Я думаю, вы сможете приспособиться к вашей цели.Способ мышления заключается в следующем - хранить день и соответствующее время в dict.если это тот же день - просто напишите разницу.В противном случае запишите время до первой полуночи, повторяйте, когда нужны дни, и записывайте время с последней полуночи до конца.К вашему сведению ... Я думаю, что за 2014-09-01 результат может быть 21 час.

from datetime import datetime, timedelta
from collections import defaultdict


s = [('2014-08-28 17:00:00', '2014-08-29 22:00:00'),
     ('2014-08-29 10:45:00', '2014-09-01 17:00:00'),
     ('2014-09-01 15:00:00', '2014-09-01 19:00:00') ]


def aggreate(time):
    store = defaultdict(timedelta)

    for slice in time:
        start = datetime.strptime(slice[0], "%Y-%m-%d %H:%M:%S")
        end = datetime.strptime(slice[1], "%Y-%m-%d %H:%M:%S")

        start_date = start.date()
        end_date = end.date()

        if start_date == end_date:
            store[start_date] += end - start

        else:
            midnight = datetime(start.year, start.month, start.day + 1, 0, 0, 0)
            part1 = midnight - start
            store[start_date] += part1

            for i in range(1, (end_date - start_date).days):
                next_date = start_date + timedelta(days=i)
                store[next_date] += timedelta(hours=24)

            last_midnight = datetime(end_date.year, end_date.month, end_date.day, 0, 0, 0)
            store[end_date] += end - last_midnight

    return store


r = aggreate(s)

for i in r:
    print(i, r[i])

2014-08-28 7:00:00
2014-08-29 1 day, 11:15:00
2014-08-30 1 day, 0:00:00
2014-08-31 1 day, 0:00:00
2014-09-01 21:00:00
...