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

时间:2020-03-11 08:39:58

标签: python-3.x pandas dataframe datetime

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

   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_date2020-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

2 个答案:

答案 0 :(得分:1)

我认为这里DataFrame.apply对于按列处理比较好,DataFrame.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

答案 1 :(得分:0)

以下解决方案有效:

df[['start_date', 'end_date']] = df[['start_date', 'end_date']].applymap(lambda x: pd.to_datetime(x, format = '%Y/%m/%d'))
df.loc[((df['start_date'].dt.year == 2020) & (df['start_date'].dt.month==4)) | ((df['end_date'].dt.year == 2020) & (df['end_date'].dt.month==4))]

出局:

   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