2016-10-06 36 views
2

存在日期我有這樣一個數據幀:蟒蛇 - 大熊貓 - 檢查是否在數據幀

 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 

我想檢查的日期是在這個數據幀存在,但我不能。我嘗試了以下各種方式,但仍然沒有用:

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 comparisondate exist未被打印。

+1

什麼是df ['date']'dtype'因爲它很重要,你也可以做'(df ['date'] == yourdate).any()' – EdChum

回答

2

我想你需要通過to_datetime轉換爲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 

對於轉換爲numpy arrayTrue使用校驗值由values

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

或至少一個Trueany作爲註釋Edchum

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

好奇的是,最後一個不起作用。除非這是一個額外的空間或什麼的問題。順便說一句,你知道爲什麼在使用'in'時需要在'Series'上使用'.values'嗎?值和索引之間的歧義? –

+0

@ juanpa.arrivillaga - 顯然'價值'可以忽略,我不知道它如何與日期時間。 – jezrael

+0

那麼,在我的解釋器外殼中,如果我在df ['date']中使用''2010-03-01'''我得到'False',但是如果我在df ['date中使用'2010-03-01' '] .values'我變得真實。 –

0

例如,爲了cofirm那的ds的第四值包含在其自身內:

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

ds是形式爲[指數,pandas._libs.tslib.Timestamp]用的熊貓DataSeries示例值:

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其中每個條目表示羯羊ds中的位置與作爲函數參數傳遞的值相匹配(因爲isin需要我們需要以列表格式提供值的值列表)。

接下來,我們使用set全局方法來獲取具有1或2個值的集合,具體取決於是否存在匹配(True和False值)或不匹配(僅爲False值)。

最後,我們檢查該集合是否包含超過1個值,如果是這種情況,則表示我們有匹配,否則就不匹配。