当列标题是日期时间值时,如何按列标题值对Pandas数据框进行切片?

时间:2015-12-23 18:08:03

标签: python pandas

我有一个excel文件,其中列名由日期时间值组成。

正如您所见,标题值采用日期时间格式。我已将此加载到Pandas数据帧,标题值确实保存为日期时间值。

现在,如果我需要从Pandas查询,例如,"选择所有大于5月15日和#34的列;我怎么能这样做?

我知道通过查询df[df.columns[3:]]我可以做到这一点。但我真的想根据列标题的值进行切片,而不是基于列的位置

请帮忙。

修改: 根据下面的答案,我找到了一种查询列值的方法。将其添加到此处以供将来参考。

from datetime import datetime

df[[col for col in df.columns if col not in ("Name", "Location") 
           and col >= datetime(2015,4,1) 
           and col <= datetime(2016,3,1)]]

from datetime import datetime

df.loc[:, [col for col in df.columns if col not in ("Name", "Location") 
       and col >= datetime(2015,4,1) 
       and col <= datetime(2016,3,1)]]

第一种解决方案是最优雅的。 从概念上讲,当预期列作为列表提供时,Pandas中的列切片工作。 List comprehenion用于根据列标签值对列进行切片。 (不是列中的值)。在示例中,我已经过滤掉了#34;名称&#34;和&#34;位置&#34;列,因为我正在根据数据时间值比较剩余的列。

2 个答案:

答案 0 :(得分:2)

查询最适合根据一个或多个变量(列)过滤观察(行)。您的数据组织方式不允许自然查询(您尝试过滤列而不是将其用作过滤器中的条件)。您可以阅读有关computed value

的更多信息

当然,您可以采取扭曲的方式来做您想做的事情,但我强烈建议您像这样整理您的数据

name | location | date   | value
--------------------------------
John | London   | Apr-15 | 1000
John | London   | May-15 | 800
...

然后您可以根据Date轻松查询,并确保该列属于日期类型,以便您可以使用例如。

df.query('20150501 < date')

然后,当您完成后,如果需要,您可以随时将数据帧恢复为原始格式(如果可以的话,最好避免它并专注于组织数据,它会支付长期运行)

答案 1 :(得分:1)

一种易于修复的方法是将Month字符串替换为其等效数字。

dct = {'Jan': 1, 'Feb':2 ...}

new = []

for item in df.columns:
    a = item.split('-')

    try: 
       b= '%02d.%02d' %(a[1],a[0])
    except:                                  # if not a datetime i.e. 'name'
       b= str(a[0]) 

    new.append(b)

df.columns=new

这应该使您的日期格式为15.04,15.05 .. 16.11等。

另外:您还可以将标题转换为日期时间并以这种方式查询:

 from datetime import datetime
 new=[]
 for item in df.columns:
      try:
          new.append( datetime.strptime( item , '%b-%y') )
      except:
          new.append( item )
 df.columns=new

 df.loc[:, df.columns <= datetime(2015, 5, 1)]