Python 使用pandas的时间段中的装箱持续时间
对于我正在进行的研究,我需要知道将工作的“持续时间”划分为任意时段(每小时、每天、每月等)。如果作业1从9:30开始到12:30结束,我希望在这4个时段(9-10、10-11、11-12、12-13)中有一个消耗量,比如:30分钟、1小时、1小时和30分钟 我可以做到这一点,但速度非常慢。一个大约30000个作业的基本案例大约需要100秒,只占总数的0.5% 框架的构造如下所示: 开始 底架 基本框架创建一个id,并将“开始”和“结束”放在同一列中 |id | job | time | |---:|------:|:--------------------| | 0 | 1 | 2020-01-01 10:00:00 | | 0 | 1 | 2020-01-01 11:33:00 | | 1 | 2 | 2020-01-01 10:00:00 | | 1 | 2 | 2020-01-02 09:33:00 | 你知道如何解决这个问题吗?我所依赖的循环思想(因为对于每一个循环,我都需要重新采样)将非常缓慢 提前谢谢大家 |id | job | time | |---:|------:|:--------------------| | 0 | 1 | 2020-01-01 10:00:00 | | 0 | 1 | 2020-01-01 11:33:00 | | 1 | 2 | 2020-01-01 10:00:00 | | 1 | 2 | 2020-01-02 09:33:00 |Python 使用pandas的时间段中的装箱持续时间,python,pandas,dataframe,datetime,Python,Pandas,Dataframe,Datetime,对于我正在进行的研究,我需要知道将工作的“持续时间”划分为任意时段(每小时、每天、每月等)。如果作业1从9:30开始到12:30结束,我希望在这4个时段(9-10、10-11、11-12、12-13)中有一个消耗量,比如:30分钟、1小时、1小时和30分钟 我可以做到这一点,但速度非常慢。一个大约30000个作业的基本案例大约需要100秒,只占总数的0.5% 框架的构造如下所示: 开始 底架 基本框架创建一个id,并将“开始”和“结束”放在同一列中 |id | job | time
def assignFunc(x):
x["duration"] = pd.Timedelta(0)
if len(x) >= 2:
x.iloc[0, x.columns.get_loc('duration')] = x.index[1] - x['time'].iloc[0]
x.iloc[1:, x.columns.get_loc('duration')] = x['time'].iloc[1:] - x.index[1:]
else:
x.iloc[0, x.columns.get_loc('duration')] = base_frame['time'].iloc[-1] - base_frame['time'].iloc[0]
return x["duration"]
frame = base_frame.groupby(base_frame.index).apply(lambda x: x.set_index('time', drop=False).resample(frequency).bfill().assign(duration=assignFunc))
frame["duration"] = frame.where(frame.duration <= pd.Timedelta(frequency), pd.Timedelta(frequency))["duration"]
print(frame.drop("time",axis=1))
time
0 2020-01-01 10:00:00 1 0 days 01:00:00
2020-01-01 11:00:00 1 0 days 00:33:00
1 2020-01-01 10:00:00 2 0 days 01:00:00
2020-01-01 11:00:00 2 0 days 01:00:00
2020-01-01 12:00:00 2 0 days 01:00:00
2020-01-01 13:00:00 2 0 days 01:00:00
2020-01-01 14:00:00 2 0 days 01:00:00
2020-01-01 15:00:00 2 0 days 01:00:00
2020-01-01 16:00:00 2 0 days 01:00:00
....