Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用pandas的时间段中的装箱持续时间_Python_Pandas_Dataframe_Datetime - Fatal编程技术网

Python 使用pandas的时间段中的装箱持续时间

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

对于我正在进行的研究,我需要知道将工作的“持续时间”划分为任意时段(每小时、每天、每月等)。如果作业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 |
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
....