数据结构 - 在Python中将ID移到下一个日期

0 投票
2 回答
72 浏览
提问于 2025-04-14 17:15

我有一个数据集,里面有日期和ID。

这里插入图片描述

Created the dataset using the following code

import pandas as pd

# Function to generate the specified dataset
def generate_dataset():
    data = {
        'Date': ['09-03-2024']*7 + ['10-03-2024']*4,
        'ID': [f'ID_{i}' for i in range(1, 12)]
    }
    df = pd.DataFrame(data)
    return df

# Generate the dataset
dataset = generate_dataset()

# Print the dataset
print(dataset)

我需要一个函数,这个函数可以接收这样的数据集,还有每天最多可以有多少个ID。它应该把多出来的ID移动到下一个日期。这个操作要对所有不同的日期都进行。所以如果每天最多允许2个ID,输出结果应该像这样。

这里插入图片描述

2 个回答

1

如果我理解得没错,首先要获取最小的日期,然后利用 np.arange 生成一些天数,再通过整除和 to_timedelta 来处理这些天数。最后,如果需要的话,可以用 strftime 将结果转换回字符串格式。

import numpy as np

df = generate_dataset()

N = 2 # max number per day

df['Date'] = (pd.to_datetime(df['Date'], dayfirst=True).min()
              +pd.to_timedelta(np.arange(len(df))//N, unit='D')
             ).strftime('%d-%m-%Y')

输出结果:

          Date     ID
0   09-03-2024   ID_1
1   09-03-2024   ID_2
2   10-03-2024   ID_3
3   10-03-2024   ID_4
4   11-03-2024   ID_5
5   11-03-2024   ID_6
6   12-03-2024   ID_7
7   12-03-2024   ID_8
8   13-03-2024   ID_9
9   13-03-2024  ID_10
10  14-03-2024  ID_11

中间步骤:

          Date     ID   datetime  arange  //2 timedelta datetime+timedelta    strftime
0   09-03-2024   ID_1 2024-03-09       0    0    0 days         2024-03-09  09-03-2024
1   09-03-2024   ID_2 2024-03-09       1    0    0 days         2024-03-09  09-03-2024
2   10-03-2024   ID_3 2024-03-10       2    1    1 days         2024-03-10  10-03-2024
3   10-03-2024   ID_4 2024-03-10       3    1    1 days         2024-03-10  10-03-2024
4   11-03-2024   ID_5 2024-03-11       4    2    2 days         2024-03-11  11-03-2024
5   11-03-2024   ID_6 2024-03-11       5    2    2 days         2024-03-11  11-03-2024
6   12-03-2024   ID_7 2024-03-12       6    3    3 days         2024-03-12  12-03-2024
7   12-03-2024   ID_8 2024-03-12       7    3    3 days         2024-03-12  12-03-2024
8   13-03-2024   ID_9 2024-03-13       8    4    4 days         2024-03-13  13-03-2024
9   13-03-2024  ID_10 2024-03-13       9    4    4 days         2024-03-13  13-03-2024
10  14-03-2024  ID_11 2024-03-14      10    5    5 days         2024-03-14  14-03-2024
0

下面的代码可以实现你所需要的功能,你可以根据自己的需求设置 MaxPerDay 这个参数的值:

def shiftdates(dataset,MaxPerDay=2):
    #Change the date column to a datetime object
    dataset['Date']=pd.to_datetime(dataset['Date'],dayfirst=True)

    NewDatelst=[]
    StartDate=dataset.iloc[0]['Date']
    iterRange=math.floor(len(dataset)/MaxPerDay)
    
    for i in range(iterRange):
        for j in range(MaxPerDay):
            NewDatelst.append(StartDate)
        StartDate=StartDate+np.timedelta64(1, 'D')      
        if i==iterRange-1:
            cleanupIter=len(dataset)-len(NewDatelst)
            for k in range(cleanupIter):
                NewDatelst.append(StartDate)
                
    
    NewDataSet=pd.DataFrame({'Date':NewDatelst,'ID':list(dataset['ID'])})
    
    return NewDataSet

在这里输入图片描述

撰写回答