/ / Python Pandas изравняване на календар с припокриващи се срещи, за да получите реално време в срещите - python, datetime, pandas, dataframe

Python Pandas изравняване на календар с припокриващи се срещи за получаване на реално време в срещите - python, datetime, pandas, dataframe

Имам подробности за моя седмичен календар(очевидно променихте субектите, за да защитите невинните), четете в рамка от данни на панди. Една от целите ми е да получа общото време в срещите. Бих искал да има индекс, индексиран по date_range с почасови честоти за седмицата, показващ колко общи минути бях на срещи през тези часове. Първото ми предизвикателство е, че срещите се припокриват и колкото бих искал да бъда на две места наведнъж, със сигурност не съм. Аз обаче изскачам от едно и друго в друго. Така например редовете в индекс 8 и 9 трябва да са общо време за срещи 90 минути, а не 120 минути, както би било в случай, че просто df ["Продължителност"]. Sum () "d колона. Как да изравня периодите от време в рамката от данни, за да преброите само припокриването само веднъж? Изглежда, че има отговор някъде, използвайки date_range и периоди, но не мога да обвия главата си около него. По-долу е моята рамка за данни df.

               Start                End Duration    Subject
0   07/04/16 10:30:00  07/04/16 11:00:00    30      Inspirational Poster Design Session
1   07/04/16 15:00:00  07/04/16 15:30:00    30      Corporate Speak Do"s and Don"ts
2   07/04/16 09:00:00  07/04/16 12:00:00    180     Metrics or Matrix -Panel Discussion
3   07/04/16 13:30:00  07/04/16 15:00:00    90      "Do More with Less" kickoff party
4   07/05/16 09:00:00  07/05/16 10:00:00    60      Fiscal or Physical -Panel Discussion
5   07/05/16 14:00:00  07/05/16 14:30:00    30      "Why we can"t have nice thing" training video
6   07/06/16 15:00:00  07/06/16 16:00:00    60      One-on-One with manager -Panel Discussion
7   07/06/16 09:00:00  07/06/16 10:00:00    60      Fireing for Performance leadership session
8   07/06/16 13:00:00  07/06/16 14:00:00    60      Birthday Cake in the conference room *MANDATORY*
9   07/06/16 12:30:00  07/06/16 13:30:00    60      Obligatory lunchtime meeting because it was the only time everyone had avaiable

Всяка помощ ще бъде много оценявана.

РЕДАКТИРАНЕ: Това е изходът, на който бих се надявал с горния набор от данни.

2016-07-04 00:00:00 0
2016-07-04 01:00:00 0
2016-07-04 02:00:00 0
2016-07-04 03:00:00 0
2016-07-04 04:00:00 0
2016-07-04 05:00:00 0
2016-07-04 06:00:00 0
2016-07-04 07:00:00 0
2016-07-04 08:00:00 0
2016-07-04 09:00:00 60
2016-07-04 10:00:00 60
2016-07-04 11:00:00 60
2016-07-04 12:00:00 0
2016-07-04 13:00:00 30
2016-07-04 14:00:00 60
2016-07-04 15:00:00 30
2016-07-04 16:00:00 0
2016-07-04 17:00:00 0
2016-07-04 18:00:00 0
2016-07-04 19:00:00 0
2016-07-04 20:00:00 0
2016-07-04 21:00:00 0
2016-07-04 22:00:00 0
2016-07-04 23:00:00 0
2016-07-05 00:00:00 0
2016-07-05 01:00:00 0
2016-07-05 02:00:00 0
2016-07-05 03:00:00 0
2016-07-05 04:00:00 0
2016-07-05 05:00:00 0
2016-07-05 06:00:00 0
2016-07-05 07:00:00 0
2016-07-05 08:00:00 0
2016-07-05 09:00:00 60
2016-07-05 10:00:00 0
2016-07-05 11:00:00 0
2016-07-05 12:00:00 0
2016-07-05 13:00:00 0
2016-07-05 14:00:00 30
2016-07-05 15:00:00 0
2016-07-05 16:00:00 0
2016-07-05 17:00:00 0
2016-07-05 18:00:00 0
2016-07-05 19:00:00 0
2016-07-05 20:00:00 0
2016-07-05 21:00:00 0
2016-07-05 22:00:00 0
2016-07-05 23:00:00 0
2016-07-06 00:00:00 0
2016-07-06 01:00:00 0
2016-07-06 02:00:00 0
2016-07-06 03:00:00 0
2016-07-06 04:00:00 0
2016-07-06 05:00:00 0
2016-07-06 06:00:00 0
2016-07-06 07:00:00 0
2016-07-06 08:00:00 0
2016-07-06 09:00:00 60
2016-07-06 10:00:00 0
2016-07-06 11:00:00 0
2016-07-06 12:00:00 30
2016-07-06 13:00:00 60
2016-07-06 14:00:00 0
2016-07-06 15:00:00 60
2016-07-06 16:00:00 0
2016-07-06 17:00:00 0
2016-07-06 18:00:00 0
2016-07-06 19:00:00 0
2016-07-06 20:00:00 0
2016-07-06 21:00:00 0
2016-07-06 22:00:00 0
2016-07-06 23:00:00 0
2016-07-07 00:00:00 0

Отговори:

1 за отговор № 1

Една от възможностите е създаването на времеви серии (s по-долу) индексирано по минута, което слединезависимо дали сте на среща през тази минута или не, и след това го представете повторно по час. За да съответствате на желания изход, можете да коригирате началния и крайния час на индекса на s.

import io
import pandas as pd

data = io.StringIO("""
Start,End,Duration,Subject
0,07/04/16 10:30:00,07/04/16 11:00:00,30,Inspirational Poster Design Session
1,07/04/16 15:00:00,07/04/16 15:30:00,30,Corporate Speak Do"s and Don"ts
2,07/04/16 09:00:00,07/04/16 12:00:00,180,Metrics or Matrix -Panel Discussion
3,07/04/16 13:30:00,07/04/16 15:00:00,90,"Do More with Less" kickoff party
4,07/05/16 09:00:00,07/05/16 10:00:00,60,Fiscal or Physical -Panel Discussion
5,07/05/16 14:00:00,07/05/16 14:30:00,30,"Why we can"t have nice thing" training video
6,07/06/16 15:00:00,07/06/16 16:00:00,60,One-on-One with manager -Panel Discussion
7,07/06/16 09:00:00,07/06/16 10:00:00,60,Fireing for Performance leadership session
8,07/06/16 13:00:00,07/06/16 14:00:00,60,Birthday Cake in the conference room *MANDATORY*
9,07/06/16 12:30:00,07/06/16 13:30:00,60,Obligatory lunchtime meeting because it was the only time everyone
""")
df = pd.read_csv(data, usecols=["Start", "End", "Subject"])
df["Start"] = pd.to_datetime(df["Start"])
df["End"] = pd.to_datetime(df["End"])

# Ranges in datetime indices include the right endpoint
tdel = pd.Timedelta("1min")

s = pd.Series(False, index=pd.date_range(start=df["Start"].min(),
end=df["End"].max()-tdel,
freq="min"))
for _, meeting in df.iterrows():
s[meeting["Start"] : meeting["End"]-tdel] = True

result = s.resample("1H").sum().astype(int)
print(result)

изход:

2016-07-04 09:00:00    60
2016-07-04 10:00:00    60
2016-07-04 11:00:00    60
2016-07-04 12:00:00     0
2016-07-04 13:00:00    30
2016-07-04 14:00:00    60
2016-07-04 15:00:00    30
2016-07-04 16:00:00     0
2016-07-04 17:00:00     0
2016-07-04 18:00:00     0
2016-07-04 19:00:00     0
2016-07-04 20:00:00     0
2016-07-04 21:00:00     0
2016-07-04 22:00:00     0
2016-07-04 23:00:00     0
2016-07-05 00:00:00     0
2016-07-05 01:00:00     0
2016-07-05 02:00:00     0
2016-07-05 03:00:00     0
2016-07-05 04:00:00     0
2016-07-05 05:00:00     0
2016-07-05 06:00:00     0
2016-07-05 07:00:00     0
2016-07-05 08:00:00     0
2016-07-05 09:00:00    60
2016-07-05 10:00:00     0
2016-07-05 11:00:00     0
2016-07-05 12:00:00     0
2016-07-05 13:00:00     0
2016-07-05 14:00:00    30
2016-07-05 15:00:00     0
2016-07-05 16:00:00     0
2016-07-05 17:00:00     0
2016-07-05 18:00:00     0
2016-07-05 19:00:00     0
2016-07-05 20:00:00     0
2016-07-05 21:00:00     0
2016-07-05 22:00:00     0
2016-07-05 23:00:00     0
2016-07-06 00:00:00     0
2016-07-06 01:00:00     0
2016-07-06 02:00:00     0
2016-07-06 03:00:00     0
2016-07-06 04:00:00     0
2016-07-06 05:00:00     0
2016-07-06 06:00:00     0
2016-07-06 07:00:00     0
2016-07-06 08:00:00     0
2016-07-06 09:00:00    60
2016-07-06 10:00:00     0
2016-07-06 11:00:00     0
2016-07-06 12:00:00    30
2016-07-06 13:00:00    60
2016-07-06 14:00:00     0
2016-07-06 15:00:00    60
Freq: H, dtype: int64