根据我对问题的理解,您需要一个“weekday_hours”列,但您还希望能够根据此列对数据进行排序。这有点棘手,因为“星期一”没有提供足够的信息来定义有效的datetime。例如,使用pd.to_datetime(df['weekday_hours'], format='%A %H:%M' 进行解析,如果只给出工作日和时间,将返回1900-01-01 <hour::minute::second>。排序时,仅按时间排序。
一种解决方法是使用dateutil 来解析日期。代替日期,它将返回对应于星期几的下一个日期。例如,今天(2021 年 4 月 9 日)dateutil.parser.parse('Friday 10:00') 返回 datetime.datetime(2021, 4, 9, 10, 0) 和 dateutil.parser.parse('Monday 10:00') 返回 datetime.datetime(2021, 4, 12, 10, 0)。因此,我们需要将“默认”日期设置为与一周中的“第一”天相对应的日期。这是一个以未排序日期开头的示例:
import datetime
import dateutil
import pandas as pd
weekdays = ['Friday', 'Monday', 'Monday', 'Tuesday']
times = ['10:00', '13:00', '12:00', '20:00', ]
df = pd.DataFrame({'weekday' : weekdays, 'time' : times})
df2 = pd.DataFrame()
df2['weekday_hours'] = df[['weekday', 'time']].agg(' '.join, axis=1)
amonday = datetime.datetime(2021, 2, 1, 0, 0) # assuming week starts monday
sorter = lambda t: [dateutil.parser.parse(ti, default=amonday) for ti in t]
print(df2.sort_values('weekday_hours', key=sorter))
产生输出:
weekday_hours
2 Monday 12:00
1 Monday 13:00
3 Tuesday 20:00
0 Friday 10:00
请注意,如果您处理大量数据,则可能有更高效的计算方法,但这应该说明可排序的工作日/时间对的想法。