2017-04-12 1 views
1

Je veux extraire l'heure du lever et si je fais ce qui suitdonnées DEGAGER chaîne de date de pyephem en Python

sun = ephem.Sun() 
r1 = home.next_rising(sun) 
print ("Visual sunrise %s" % r1) 
risehr = r1[10:12] 
print ("Rise Hour = %s" % risehr) 

Je suis l'erreur

>>'ephem.Date' object has no attribute '__getitem__' 

Je peux imprimer la chaîne r1 mais pas en extraire (?) J'ai essayé des solutions à partir de problèmes similaires sur l'extraction, mais je n'ai pas pu faire de progrès, je m'excuse si cela semble être un double post.

+1

quand vous l'imprimez, il est converti en une chaîne, comme 'str (r1)', voulez-vous en prendre une partie? C'EST À DIRE. 'str (r1) [10:12]' –

+1

où est l'instruction d'affectation pour 'home'? – wpercy

+0

Désolé, 'home' est mon lat/long def – Geo

Répondre

3

Comme je comprends votre question que vous voulez imprimer seulement l'heure du lever du soleil. r1 est l'objet de ephem.Date type. Vous pouvez le faire avec la force brute

... 
risehr = str(r1)[10:12] 
... 

ou vous pouvez convertir r1 objet à datetime et datetime-str représentation

... 
risehr = r1.datetime().strftime('%H') 
... 

ou le convertir en tuple premier

... 
risehr = r1.tuple()[3] 
... 

Tous disponibles options que vous pourriez lire au this page dans la section Conversions.

+0

Un grand merci. La force brute fonctionne très bien, je vais essayer la méthode la plus élégante aussi. – Geo

+0

@Geo Vous êtes les bienvenus) – kvorobiev

1

@kvorobiev a répondu à la question de savoir comment extraire d'une représentation sous forme de chaîne de vos données. Mais l'autre moitié de votre question était l'erreur:

'ephem.Date' object has no attribute '__getitem__'

Selon le PyEphem documentation pour la fonction next_rising(),

If the search is successful, returns a Date value.

Furthermore, Date objects have an important property:

Dates are stored and returned as floats. Only when printed, passed to str(), or formatted with '%s' does a date express itself as a string giving the calendar day and time.

Lorsque vous avez donné la commande risehr = r1[10:12], l'interpréteur Python a tenté d'obtenir l'appel Date.getattr() pour obtenir les champs d'un objet Date correspondant à la tranche 10:12. Sans cette méthode, le découpage n'a aucune signification pour un objet Date.

Mais tout n'est pas perdu! Vous pouvez toujours obtenir des informations de temps de l'objet Date:

Call .tuple() to split a date into its year, month, day, hour, minute, and second.

Vous pouvez alors couper ce tuple que nécessaire pour obtenir l'heure:

hour = r1.tuple()[3]

Ou exhaustive:

year, month, day, hour, minute, second = r1.tuple()

+0

L'approche de tuple semble vraiment soigné. J'ai appris beaucoup de toutes les réponses utiles à mon problème simple. Merci beaucoup à tous pour les commentaires très informatifs. – Geo