2016-10-06 7 views
2

У меня есть dataframe вроде этого:питона - панды - проверить, если дата существует в dataframe

 category date   number 
0  Cat1  2010-03-01  1 
1  Cat2  2010-09-01  1 
2  Cat3  2010-10-01  1 
3  Cat4  2010-12-01  1 
4  Cat5  2012-04-01  1 
5  Cat2  2013-02-01  1 
6  Cat3  2013-07-01  1 
7  Cat4  2013-11-01  2 
8  Cat5  2014-11-01  5 
9  Cat2  2015-01-01  1 
10  Cat3  2015-03-01  1 

Я хотел бы проверить, если дата существует в этом dataframe, но я не могу. Я пробовал различные способы, как показано ниже, но по-прежнему не используется:

if pandas.Timestamp("2010-03-01 00:00:00", tz=None) in df['date'].values: 
    print 'date exist' 

if datetime.strptime('2010-03-01', '%Y-%m-%d') in df['date'].values: 
    print 'date exist' 

if '2010-03-01' in df['date'].values: 
    print 'date exist' 

«Дата существует» никогда не печаталась. Как я могу проверить, существует ли дата? Поскольку я хочу вставить не существующую дату с числом равным 0 во все категории, чтобы я мог построить график непрерывной линии (по одной категории в строке). Помощь приветствуется. Заранее спасибо.

Последняя дает мне это: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison И date exist не получить печатные.

+1

Что такое 'dtype'' 'df ['date']' как это важно, вы также можете просто сделать '(df ['date'] == yourdate) .any()' – EdChum

ответ

2

Я думаю, что вам нужно преобразовать DateTime сначала to_datetime, а затем, если нужно выбрать все строки использовать boolean indexing:

df.date = pd.to_datetime(df.date) 

print (df.date == pd.Timestamp("2010-03-01 00:00:00")) 
0  True 
1  False 
2  False 
3  False 
4  False 
5  False 
6  False 
7  False 
8  False 
9  False 
10 False 
Name: date, dtype: bool 

print (df[df.date == pd.Timestamp("2010-03-01 00:00:00")]) 
    category  date number 
0  Cat1 2010-03-01  1 

Для возврата True используйте контрольное значение преобразуется в numpy array по values:

if ('2010-03-01' in df['date'].values): 
    print ('date exist') 

Или по меньшей мере один True по any в качестве комментария Edchum:

if (df.date == pd.Timestamp("2010-03-01 00:00:00")).any(): 
    print ('date exist') 
+0

Любопытно, что последний не работает. Если это не проблема с дополнительными пробелами или чем-то еще. В стороне, знаете ли вы, почему необходимо использовать '.values' в' Series' при использовании 'in'? Неоднозначность между значениями и индексом? –

+0

@ juanpa.arrivillaga - Очевидно, что «значения» могут быть пропущены, я не знаю, как это работает с датами. – jezrael

+0

Ну, в моей интерпретаторной оболочке, если я использую '' 2010-03-01 'в df [' date '] 'Я получаю' False', но если я использую '' 2010-03-01' в df ['date '] .значения' Я верю. –

0

Например, чтобы cofirm, что 4-е значение ds содержится внутри себя:

len(set(ds.isin([ds.iloc[3]]))) > 1 

Пусть ds представлять собой панды DataSeries вида [индекс] с pandas._libs.tslib.Timestamp пример значения:

0 2018-01-31 19:08:27.465515 1 2018-02-01 19:08:27.465515 2 2018-02-02 19:08:27.465515 3 2018-02-03 19:08:27.465515 4 2018-02-04 19:08:27.465515

Затем мы используем локальный метод isin, чтобы получить DataSeries булевых переменных, где каждая запись указывает Wether эта позиция в ds соответствует значению, переданному в качестве аргумента функции (поскольку isin ожидает список значений, необходимых для предоставления значения в формате списка).

Далее мы используем глобальный метод set, чтобы получить набор с 1 или 2 значениями в зависимости от того, было ли совпадение (значения True и False) или нет (только значение False).

Наконец, мы проверяем, содержит ли набор более одного значения, если это так, это означает, что мы имеем совпадение и не имеем никакого соответствия.

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