开发者社区> 问答> 正文

根据Pandas中的特定年份和月份从多个日期列中过滤行

对于给定的数据帧,如下所示:

   id  start_date    end_date
0   1   2014/5/26   2014/5/27
1   2   2014/6/27   2014/6/28
2   3   2014/7/20   2014/7/21
3   4   2014/9/12   2014/9/13
4   5  2014/10/10  2014/10/11
5   6   2020/3/20   2020/4/21
6   7   2020/4/10   2020/4/11
7   8   2020/4/15   2020/4/16
8   9   2020/3/23   2020/3/24
9  10    2020/4/6    2020/4/7

我想过滤start_dateend_date处于2020-02、2020-03、2020-04范围内的行,感谢您分享除我之外的其他可选解决方案。

前瞻结果将如下所示:

   id start_date   end_date
5   6 2020-03-20 2020-04-21
6   7 2020-04-10 2020-04-11
7   8 2020-04-15 2020-04-16
9  10 2020-04-06 2020-04-07

问题来源:stackoverflow

展开
收起
is大龙 2020-03-24 17:56:02 495 0
1 条回答
写回答
取消 提交回答
  • 我认为这对于按列进行处理是更好的DataFrame.applyDataFrame.applymap用于按元素处理:

    df[['start_date', 'end_date']] = (df[['start_date', 'end_date']]
                                       .apply(lambda x: pd.to_datetime(x, format = '%Y/%m/%d')))
    

    然后通过Series.dt.to_period使用几个月的周期进行过滤:

    df = (df[(df['start_date'].dt.to_period('m')== '2020-04') | 
             (df['end_date'].dt.to_period('m')== '2020-04')])
    print (df)
       id start_date   end_date
    5   6 2020-03-20 2020-04-21
    6   7 2020-04-10 2020-04-11
    7   8 2020-04-15 2020-04-16
    9  10 2020-04-06 2020-04-07
    

    通过np.logical_or.reduce可以按列循环解决,如果有更多列,则解决方案更好:

    c = ['start_date', 'end_date']
    df[c] = df[c].apply(lambda x: pd.to_datetime(x, format = '%Y/%m/%d'))
    
    df = df[np.logical_or.reduce([df[x].dt.to_period('m')== '2020-04' for x in c])]
    print (df)
       id start_date   end_date
    5   6 2020-03-20 2020-04-21
    6   7 2020-04-10 2020-04-11
    7   8 2020-04-15 2020-04-16
    9  10 2020-04-06 2020-04-07
    

    回答来源:stackoverflow

    2020-03-24 17:56:12
    赞同 展开评论 打赏
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
中文:即学即用的Pandas入门与时间序列分析 立即下载
即学即用的Pandas入门与时间序列分析 立即下载
低代码开发师(初级)实战教程 立即下载