Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按天获取熊猫过滤器中的下一个可用日期_Python_Pandas_Lambda_Datetime64 - Fatal编程技术网

Python 按天获取熊猫过滤器中的下一个可用日期

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的数

我已经在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
的数据。理想情况下,如果某个日期落在周末(周六和周日或任何缺失的日期,如节假日或特定日期的数据不可用),我希望获得下一个可用日期的数据。想知道我们是否可以使用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