2015-12-23 1 views
1

У меня есть файл excel, где имя столбца состоит из значения даты и времени.Как разрезать кадр данных Pandas по значению заголовка столбца, когда заголовок столбца является значением даты и времени?

Как вы можете видеть, значение заголовка в формате даты и времени. Я загрузил это в кадр данных Pandas, и значения заголовка действительно сохранены как значение даты-времени.

Теперь, если мне нужно запросить у Панд, например, «выбрать все столбцы, превышающие май-15», как я могу это сделать?

Я знаю, что по запросу df[df.columns[3:]] я могу добиться этого. Но я действительно хочу срезать на основе значения заголовка столбца и не на основе позиции столбца.

Пожалуйста, помогите.


Edit: Основываясь на ответах ниже, я выяснил способ для запроса значений столбцов. Добавьте его сюда для дальнейшего использования.

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)]] 

1-решение является наиболее элегантным. Понятно, что для разрезания столбцов в Pandas работает, когда назначенные столбцы представлены в виде списка. Сглаживание списков используется для среза столбцов на основе значений метки столбца. (а не значения внутри столбца). В примерах я отфильтровал столбцы «Имя» и «Местоположение», так как сравниваю оставшиеся столбцы на основе значения даты.

+0

Я не знаю панду, но вы можете попробовать сделать фильтр заголовков, которые дата-время, и если они сопоставимы, сравните его по желаемому значению ... – Copperfield

+0

@ HVS Любые обновления? – bakkal

+0

@ HVS только что обновил мой ответ, вспомнив, что вы можете конвертировать столбцы в объекты datetime и использовать условные обозначения, как обычно! – user2589273

ответ

1

Одним из простых способов было бы заменить строку месяца эквивалентным номером.

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)] 
+0

Спасибо. Ваш совет подскажет мне решение. df.loc [:, df.columns <= datetime (2015, 5, 1)] не работает из-за столбцов не-datetime. Если вы отфильтровываете его, он работает. df.loc [:, [col для col в df.columns, если col не в ("Name", "Location") и col> = datetime (2015,4,1) и col <= datetime (2016,3,1)]] – HVS

2

Querying работает лучше всего для фильтрации наблюдений (строк) на основе одной или нескольких переменных (столбцов). Способ организации ваших данных не допускает естественного запроса (вы пытаетесь фильтровать столбцы, а не использовать их в качестве критериев в фильтре). Вы можете прочитать больше о tidying dataframes here

Конечно, вы можете придумать искаженным способом сделать то, что вы хотите, но я настоятельно рекомендую вам привести в порядок ваши данные, как этот

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

Затем вы можете легко запрос на основе Date и убедитесь, что столбец имеет тип даты, поэтому вы можете использовать, например,

df.query('20150501 < date') 

Затем, когда вы сделали, и если у вас есть, вы всегда можете вернуть dataframe в исходном формате, если это необходимо (Если вы не можете, лучше, чтобы избежать этого и сосредоточиться на организации данных, он платит в конечном счете)

+0

спасибо за ответ. Это то, чего я пытаюсь достичь. Я хочу преобразовать данные в год и месяц как отдельные столбцы. Формат данных, который я предоставил, может работать до 5 лет; поэтому 5 * 12 столбцов. Я хочу преобразовать это в 13 столбцов (1 столбец в год и 12 месяцев). Поэтому я пытаюсь найти способы программно. – HVS

Смежные вопросы