根据日期获取熊猫过滤器中的下一个可用日期

时间:2018-11-12 15:59:54

标签: python pandas lambda datetime64

我已使用以下代码行过滤了熊猫数据框中的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的数据。理想情况下,如果某个日期是在周末(星期六和星期日)或任何遗漏的日期(如假期或特定日期无法提供的数据),我想获取下一个可用日期的数据。想知道我们是否可以使用熊猫,或者我需要手动迭代执行此功能。

2 个答案:

答案 0 :(得分:1)

我认为您需要DatetimeIndexasfreqmethod='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

答案 1 :(得分:1)

您还可以通过以下方法进行设置:将日期设置为索引,并使用index.get_loc()搜索下一个存在的日期到每月的第一天,并将方法设置为填充:< / p>

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