2013-04-22 13 views
28

ho provato alcune opzioni ovvio, ma nessuno di loro lavora:Python: come posso verificare se un oggetto è di tipo datetime.date?

In [150]: x 
Out[150]: datetime.date(2012, 9, 1) 

In [151]: type(x) 
Out[151]: datetime.date 

In [152]: isinstance(x, datetime.date) 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-152-9a298ea6fce5> in <module>() 
----> 1 isinstance(x, datetime.date) 

TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types 

In [153]: x is datetime.date 
Out[153]: False 

In [154]: type(x) is datetime.date 
Out[154]: False 

Qual è il modo giusto di fare questo?

+3

È possibile produrre un [SSCCE] (http://sscce.org)? Dovrei pensare che un programma a quattro o cinque righe sia sufficiente. Io [non posso riprodurre i tuoi risultati] (http://ideone.com/gqdou2) da ciò che hai già postato. –

+1

Che versione di Python stai usando? Per Python-2.6 'isinstance (x, datetime.date)' funziona bene così come 'type (x) è datetime.date' – RedBaron

+0

Quale versione di Python stai usando, e cosa hai fatto per generare' x'? –

risposta

55

Credo che la ragione non funziona nel tuo esempio è di aver importato datetime in questo modo:

from datetime import datetime 

questo porta all'errore che si vede

In [30]: isinstance(x, datetime.date) 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
/<ipython-input-30-9a298ea6fce5> in <module>() 
----> 1 isinstance(x, datetime.date) 

TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types 

se importa semplicemente in questo modo:

import datetime 

il codice deve funzionare come indicato in tutte le altre risposte

In [31]: import datetime 

In [32]: isinstance(x, datetime.date) 
Out[32]: True 

In [33]: 
+3

+1 bel lavoro da investigatore. –

+1

Se hai un datetime (invece di una semplice data), per estensione puoi fare: 'x = datetime.datetime.now()' then 'isinstance (x, datetime.datetime)' – fantabolous

+4

Bene, se vuoi per distinguere datetime.date e datetime.datetime questo metodo fallirà: '>>> import datetime' ' >>> foo = datetime.datetime.now() ' ' >>> isinstance (foo, datetime.date) '' true' .__ class__ dovrebbe aiutare '>>> foo == .__ class__ datetime.date' ' false' '>>> foo == .__ class__ datetime.datetime' ' true' – BernarditoLuis

7

modo giusto è

import datetime 
isinstance(x, datetime.date) 

Quando provo questo sulla mia macchina funziona benissimo. È necessario esaminare perché datetime.date non è una classe. Stai forse mascherandolo con qualcos'altro? o non fa riferimento a esso correttamente per la tua importazione?

+0

L'esempio nella domanda mostra che non funziona. Hai una spiegazione per questo? La soluzione di –

+1

cmd restituisce anche True se x è un datetime.datetime. Questo potrebbe non essere quello che vuoi o aspettarti. La risposta di Simon Steinberger discrimina correttamente tra datetime.date e datetime.datetime. – Chuck

+0

@ cmd In python 2.7 l'istruzione "isinstance (datetime.datetime.now(), datetime.date)" restituisce True. – Chuck

3
import datetime 
d = datetime.date(2012, 9, 1) 
print type(d) is datetime.date 

> True 
+1

Usare 'is' invece di' == 'è un modo più idiomatico di farlo:' print type (d) è datetime.date'. – SpankMe

+0

L'uso di type() per il controllo del tipo è sconsigliato e imprudente, il modo corretto è di fare istanza. –

+1

In questo caso, type() funziona come previsto per datetime.date e datetime.datetime. isinstance (x, datetime.date) restituisce True se x è un datetime.date o un datetime.datetime. – Chuck

1

Se il codice esistente è già affidamento su from datetime import datetime, si può anche semplicemente anche importare date

from datetime import datetime, timedelta, date 
print isinstance(datetime.today().date(), date) 
2

In Python 3.5, isinstance(x, date) opere a me:

>>> from datetime import date 
>>> x = date(2012, 9, 1) 
>>> type(x) 
<class 'datetime.date'> 
>>> isinstance(x, date) 
True 
>>> type(x) is date 
True 
Problemi correlati