熊猫:在分组的数据框中选择的日期是一天频率的倍数?

时间:2019-03-12 14:36:20

标签: python python-3.x pandas

我需要在包含日期的DataFrame中进行非常具体的选择。我有一个“ Lead Time”列,其中包含一个整数,我需要选择每个与DataFrame中的该整数对应的X个日期。例如: 为每个组在date_range('2019-05-01','2019-07-01')中每15天选择一行。这是我需要做的示例代码:

import pandas as pd

df = pd.DataFrame({'ITEM': ['A', 'B', 'C'] * 3, 'GROUP': [i+1 for i in range(3) for _ in range(3)],
                    'MONTH': [i+1 for i in range(3) for _ in range(3)],
                   'LEAD_TIME': [i for i in [15, 20, 10] for _ in range(3)]})
months = 2
start_date = pd.to_datetime('2019-01-01')
dates = pd.DataFrame({'DATE': pd.date_range(start_date, start_date + pd.offsets.MonthBegin(months + 1), closed="left")})
dates['MONTH'] = dates['DATE'].dt.month
df = df.merge(dates, on='MONTH')

# df.loc[every LEAD_TIME days after start_date, 'check'] = True

1 个答案:

答案 0 :(得分:1)

效率低下的解决方案

对于LEAD_TIME列中的每个值,您可以通过以下方式获取值:

init_date = '2019-05-01'
div_res = pd.to_datetime(init_date).dayofyear % lead_time

df['day_of_year'] = df.DATE.apply(lambda x: x.dayofyear)
df['day_of_year_div_ts'] = df.day_of_year.apply(lambda x: x%lead_time)
result_dates = df.DATE[df.day_of_year_div_ts==div_res].tolist()

您可以通过使用其中的一个函数并对数据框目标列使用.apply()来对其进行概括。

优雅的解决方案

lead_time = 15
start_date = pd.to_datetime('2019-01-01')
end_date = pd.to_datetime('2019-10-01')
result_dates = pd.date_range(start = start_date, end = end_date, freq=pd.DateOffset(lead_time))