Python 按天获取熊猫过滤器中的下一个可用日期
我已经在pandas dataframe中过滤了Python 按天获取熊猫过滤器中的下一个可用日期,python,pandas,lambda,datetime64,Python,Pandas,Lambda,Datetime64,我已经在pandas dataframe中过滤了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的数
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
和method='bfill'
来回填缺少的值:
df = df.set_index('Date').asfreq('d', method='bfill')
然后通过以下方式进行过滤:
样本:
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
您还可以通过将日期设置为索引,并使用将方法设置为bfill搜索下一个现有日期到每月的第一天来完成此操作:
谢谢这种方法甚至可以轻松地进行日间访问,而不用使用lambda表达式
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
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