我需要在包含日期的 DataFrame 中进行非常具体的选择。我有一个包含整数的“前置时间”列,我需要选择 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
最佳答案
低效的解决方案
对于 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))
关于python - Pandas:在分组数据框中选择一天频率的倍数的日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55124099/