我目前正在研究一个小型项目(Python 3.6.2),该项目基于从大学网站抓取的输入来自动创建时间表。为了创建时间表并存储约会(然后重新组织约会,以找到“更好的”时间表),我目前使用Pandas DataFrame结构,但并不完全满意。我希望约会占用多个单元。

08:55:00
09:40:00
09:50:00    Mod, Spez, Sem
11:30:00
11:40:00
13:20:00
13:30:00    Systemnahe und parallele Programmierung - Ü 01
15:10:00
15:20:00
16:00:00
16:05:00
16:15:00    Modellierung, Spezifikation und Semantik - Ü 02
17:00:00
17:55:00


例如,第一次约会的时间是09:50到11:40,因此应该占据这些位置。一种快速的解决方案是将约会的名称放在其占用的每个时隙中,但是感觉并不整洁。我想在完成后将其导出到Excel。
所以我的问题是,如何完成此任务?还是一直使用DataFrames是错误的?

最佳答案

您需要先填充数据,然后再分组然后指定,最后汇总时间列:

from io import StringIO
import pandas

raw = StringIO("""\
08:55:00;
09:40:00;
09:50:00;Mod, Spez, Sem
11:30:00;
11:40:00;
13:20:00;
13:30:00;Systemnahe und parallele Programmierung - Ü 01
15:10:00;
15:20:00;
16:00:00;
16:05:00;
16:15:00;Modellierung, Spezifikation und Semantik - Ü 02
17:00:00;
17:55:00;
""")

df = (
    pandas.read_table(raw, sep=';', header=None, names=['time', 'appt'], parse_dates=['time'])
        .fillna(method='ffill')
        .assign(offset=lambda df: df['appt'].shift(-1))
        .query('appt == offset')
        .groupby('appt')['time']
        .describe()[['first', 'last']]
        .rename(columns={'first': 'begin', 'last': 'end'})
        .sort_values(by=['begin'])
        .reset_index()
)


那给我:

                                              appt                begin                  end
0                                   Mod, Spez, Sem  2017-11-21 09:50:00  2017-11-21 11:40:00
1   Systemnahe und parallele Programmierung - Ü 01  2017-11-21 13:30:00  2017-11-21 16:00:00
2  Modellierung, Spezifikation und Semantik - Ü 02  2017-11-21 16:15:00  2017-11-21 17:00:00

10-05 20:44
查看更多