python - Pandas:在分组数据框中选择一天频率的倍数的日期?

标签 python python-3.x pandas

我需要在包含日期的 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/

相关文章:

python - PyCharm 中 basemap 导入错误 — KeyError : 'PROJ_LIB'

python - 如何在 Windows 上将 gzip 包上传到 PyPI

python-3.x - 如何比较多逻辑语句中数据帧之间的日期时间?

Python 更改多直方图上的轴

Python3 升序降序排序

Python 类型注解 : Any way to annotate a property?

python - 你如何在 python 中制作排行榜?

python - easy_install-3.2.exe 对比 easy_install.exe?

Python:如何写入http输入流

python - 如何在字典中存储数据框