数据结构 - 在Python中将ID移到下一个日期
我有一个数据集,里面有日期和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