在 Pandas 中按天过滤获取下一个可用日期

Get next available date in Pandas filter by day

我使用以下代码行过滤了 pandas 数据框中的 datetime64[ns] 类型,以获取每个月特定日期的数据。

df[df['Date'].map(lambda x: x.day) == 1]

输出结果如下:

19.9    2013-07-01
34.8    2013-08-01
12.9    2013-10-01
12.6    2013-11-01

但是如果您注意到 2013-09-01 的条目丢失了,因为它在原始数据集中不可用。在这种情况下,我想获取 2013-09-02 的数据。理想情况下,如果日期在周末(周六和周日或任何缺失日期,如假期或特定日期不可用的数据),我想获取下一个可用日期的数据。想知道我们是否可以使用 pandas 实现,或者我需要手动迭代执行此功能。

我认为您需要 DatetimeIndex 以及 asfreqmethod='bfill' 来填充缺失值:

df = df.set_index('Date').asfreq('d', method='bfill')

然后按DatetimeIndex.day过滤:

df1 = df[df.index.day == 1]

示例:

print (df)
    Val       Date
0  19.9 2013-07-01
1  34.8 2013-08-01
2  10.4 2013-09-02
3  12.9 2013-10-01
4  12.6 2013-11-01

print (df.dtypes)
Val            float64
Date    datetime64[ns]

df = df.set_index('Date').asfreq('d', method='bfill')
df1 = df[df.index.day == 1]
print (df1)
             Val
Date            
2013-07-01  19.9
2013-08-01  34.8
2013-09-01  10.4
2013-10-01  12.9
2013-11-01  12.6

您也可以通过将日期设置为索引并使用 index.get_loc() 搜索下一个现有日期到每个月的第一天并将方法设置为 bfill:

print(df)
             Val
Date            
2013-07-01  19.9
2013-08-01  34.8
2013-08-02  34.8
2013-09-02  10.4
2013-10-01  12.9
2013-11-01  12.6

df = df.set_index('Date')
df.iloc[[df.index.get_loc(datetime.datetime(date[0],date[1],1),
                   method='bfill') for date,_ in df.groupby(
                   [df.index.year,df.index.month])]]

             Val
Date            
2013-07-01  19.9
2013-08-01  34.8
2013-09-02  10.4
2013-10-01  12.9
2013-11-01  12.6