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

Python 当列标题是日期时间值时,如何按列标题值对数据帧进行切片?,python,pandas,Python,Pandas,我有一个excel文件,其中列名由日期时间值组成 正如您所见,标题值采用日期时间格式。我已将其加载到Pandas dataframe,标题值确实保存为日期时间值 现在,如果我需要从Pandas中进行查询,比如“选择大于5月15日的所有列”,我该怎么做 我知道通过查询df[df.columns[3:]我可以实现这一点。但是我确实希望根据列标题的值进行切片,而不是根据列的位置进行切片 请帮忙 编辑: 根据下面的答案,我找到了一种查询列值的方法。将其添加到此处以供将来参考 from datetim

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

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

现在,如果我需要从Pandas中进行查询,比如“选择大于5月15日的所有列”,我该怎么做

我知道通过查询
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)]]
从日期时间导入日期时间
df[[col代表df列中的col.如果col不在(“名称”、“位置”)
和col>=日期时间(2015,4,1)
和col=日期时间(2015,4,1)

col查询最适合根据一个或多个变量(列)筛选观察值(行)。数据的组织方式不允许自然查询(您尝试筛选列,而不是将列用作筛选条件)。您可以阅读更多有关

当然,你可以想出一种扭曲的方法来做你想做的事情,但我强烈建议你像这样整理你的数据

name | location | date   | value
--------------------------------
John | London   | Apr-15 | 1000
John | London   | May-15 | 800
...
然后,您可以轻松地根据日期进行查询,并确保列为日期类型,以便您可以使用例如

df.query('20150501 < date')
df.query('20150501

然后,当您完成后,如果有必要,您可以随时将数据帧恢复为其原始格式(如果可以,最好避免使用它,并将重点放在组织数据上,这样做从长远来看是值得的)

一个简单的修复方法是将月份字符串替换为其等效数字

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)]
从日期时间导入日期时间
新=[]
对于df.columns中的项目:
尝试:
new.append(datetime.strtime(项'%b-%y'))
除:
新增。追加(项目)
df.columns=new

df.loc[:,df.columns我不知道panda,但你可以尝试对日期时间的标题进行筛选,如果这些标题是可比较的,则根据你想要的值进行比较…@HVS刚刚更新了我的答案,记住你可以像平常一样将列转换为日期时间对象并使用条件!谢谢你的回答。这就是我正在尝试的为了实现。我想将年和月作为单独的列来转换数据。我提供的数据格式最多可以运行5年;因此5*12列。我想将其转换为13列(1列表示年,12列表示月)。因此我正在尝试以编程方式找到方法。谢谢。您的提示为我提供了一个解决方案。df.loc[:,df.columns=datetime(2015,4,1)和col
 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)]