Python Pandas 不同大小的单元格
Python Pandas Cells with different size
我目前正在开发一个小项目 (Python 3.6.2),用于根据我从大学网站上抓取的输入自动创建时间表。为了创建时间表和存储约会(以及稍后重新组织它们,以找到 "better" 时间表),我目前使用 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 是不是错了?
你需要先forward-fill你的数据,然后group by然后appointment,最后汇总时间列:
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
我目前正在开发一个小项目 (Python 3.6.2),用于根据我从大学网站上抓取的输入自动创建时间表。为了创建时间表和存储约会(以及稍后重新组织它们,以找到 "better" 时间表),我目前使用 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 是不是错了?
你需要先forward-fill你的数据,然后group by然后appointment,最后汇总时间列:
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