首页 > 解决方案 > 两个日期之间的所有星期天,使用 pandas 的索引

问题描述

如何在每个用户的 2 个日期之间生成星期日的所有日期

这是我的数据框:

df = pd.DataFrame({'Name': ['A', 'B'], 
                   'DATE_START':['2021-05-03', '2021-05-03'], 
                   'DATE_END':['2021-05-10', '2021-05-10']})

我试图找到的最终结果:

NAME    |  DATE_START |   DATE_END
--------------------------------------
A       |  2021-05-03 |    2021-05-03
A       |  2021-05-09 |    2021-05-09
A       |  2021-05-10 |    2021-05-10
B       |  2021-05-03 |    2021-05-03
B       |  2021-05-09 |    2021-05-09
B       |  2021-05-10 |    2021-05-10

我尝试这样的事情,但我无法得到结果:

def sundays(row):
    s = pd.date_range(row['DATE_START'], row['DATE_END'])
    return s[s.weekday == 6].to_list()
df.apply(sundays, axis=1)

标签: pythonpandasdataframe

解决方案


我试图使解决方案与您的解决方案相似。我认为问题主要在于字符串到日期(时间)的转换。见下文。

df = pd.DataFrame({'Name': ['A', 'B'],
                   'DATE_START':['2021-05-03', '2021-05-03'],
                   'DATE_END':['2021-05-10', '2021-05-10']})
df['DATE_START'] = pd.to_datetime(df['DATE_START'], format='%Y-%m-%d')
df['DATE_END'] = pd.to_datetime(df['DATE_END'], format='%Y-%m-%d')


def sundays(row):
    start = row['DATE_START']
    while start.day_of_week != 6:
        start += dt.timedelta(days=1)
    return pd.date_range(start, row['DATE_END'], freq='7D')
    

df['range'] = df.apply(sundays, axis=1)

推荐阅读