在条件下动态过滤熊猫中基于数据框的日期

时间:2020-06-03 08:02:58

标签: python pandas

我正在尝试根据日期字段过滤数据框。

 Date    Value
201810   100
201811   150
201812   95
201901   125
201902   150
201903   200
201904   225

过滤将动态进行。例如。首个日期和结束日期不应“硬编码”。 所以我的方法如下:

month = pd.DataFrame(set(df['Date']),columns=['Date'])
df['Date'] = pd.to_datetime(df['Date'],format='%Y%m)

在这里,我必须根据日期进行过滤并创建一个新的数据框。在最后一个日期,例如201903。

dt_first = month['Date'].head(1)   <---first date is being dynamically created
dt_last = month.iloc[-2]           <-- last date, dynamically created. 
df_filter = df[(df.Date.ge(dt_first))&(df.Date.le(dt_last))]

但是最后一行正在生成空白数据帧。生成的数据框应该看起来像

 Date    Value
 201810   100
 201811   150
 201812   95
 201901   125
 201902   150
 201903   200

我知道我错过了一些东西。

有人可以根据条件建议如何有效过滤上述数据框吗?

1 个答案:

答案 0 :(得分:0)

此处需要按标量进行比较,因此按Series.iat提取列的第一个和最后一个值:

顺便说一句,如果用ge比较具有等于或等于第一个val的排序值,则它匹配所有数据,因此此条件始终返回True,因此应使用相同的输出将其删除:

df['Date'] = pd.to_datetime(df['Date'],format='%Y%m')

df_filter = df[(df.Date.ge(df['Date'].iat[0]))&(df.Date.lt(df['Date'].iat[-1]))]

类似:

df_filter = df[(df.Date.lt(df['Date'].iat[-1]))]

print (df)
        Date  Value
0 2018-10-01    100
1 2018-11-01    150
2 2018-12-01     95
3 2019-01-01    125
4 2019-02-01    150
5 2019-03-01    200
6 2019-04-01    225