在Python中查找日期范围内的最大日期而不进行筛选

2024-09-28 22:21:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文件,每个EMID每生效日期一行。我需要找到每个EMID在特定日期之前发生的最大生效日期。例如,如果EMID=1有4行,一行用于1/1/16,一行用于10/1/16,一行用于12/1/16,一行用于12/2/17,我选择日期1/1/17作为我的特定日期,我想知道12/1/16是EMID=1在1/1/17之前出现的最大日期。你知道吗

我知道如何找到EMID的最长日期(groupby.max()). 我还可以将文件筛选到1/1/17之前的日期,并找到剩余行的最大值。但是,最终我需要1/1/17之前的最后一行,然后是1/1/17之后的所有行,因此过滤掉日期之后出现的行并不是最佳的,因为这样我就必须执行复杂的联接才能将它们重新放入。你知道吗

# Create dummy data
dummy = pd.DataFrame(columns=['EmID', 'EffectiveDate'])
dummy['EmID'] = [random.randint(1, 10000) for x in range(49999)]
dummy['EffectiveDate'] = [np.random.choice(pd.date_range(datetime.datetime(2016,1,1), datetime.datetime(2018,1,3))) for i in range(49999)]

#Create group by 
g = dummy.groupby('EmID')['EffectiveDate']
# This doesn't work, but effectively shows what I'm trying to do
dummy['max_prestart'] = max(dt for dt in g if dt < datetime(2017,1,1))

我希望输出是数据帧中的一个附加列,其最大日期在指定日期之前。你知道吗


Tags: 文件infordatetimecreatedtrangemax
1条回答
网友
1楼 · 发布于 2024-09-28 22:21:24

选择后使用map。你知道吗

s=dummy.loc[dummy.EffectiveDate>'2017-01-01'].groupby('EmID').EffectiveDate.max()
dummy['new']=dummy.EmID.map(s)

这里使用transform并假设else dt

dummy['new']=dummy.loc[dummy.EffectiveDate>'2017-01-01'].groupby('EmID').EffectiveDate.transform('max')
dummy['new']=dummy['new'].fillna(dummy.EffectiveDate)

相关问题 更多 >