J'ai une série simple:

>>> sub_dim_metrics
date
2017-04-04 00:00:00+00:00     32.38
2017-04-03 00:00:00+00:00    246.28
2017-04-02 00:00:00+00:00    146.25
2017-04-01 00:00:00+00:00    201.98
2017-03-31 00:00:00+00:00    274.74
2017-03-30 00:00:00+00:00    257.82
2017-03-29 00:00:00+00:00    279.38
2017-03-28 00:00:00+00:00    203.53
2017-03-27 00:00:00+00:00    250.65
2017-03-26 00:00:00+00:00    180.59
2017-03-25 00:00:00+00:00    196.61
2017-03-24 00:00:00+00:00    281.04
2017-03-23 00:00:00+00:00    276.44
2017-03-22 00:00:00+00:00    227.55
2017-03-21 00:00:00+00:00    267.59
Name: area, dtype: float64
>>> sub_dim_metrics.index
DatetimeIndex(['2017-04-04', '2017-04-03', '2017-04-02', '2017-04-01',
               '2017-03-31', '2017-03-30', '2017-03-29', '2017-03-28',
               '2017-03-27', '2017-03-26', '2017-03-25', '2017-03-24',
               '2017-03-23', '2017-03-22', '2017-03-21'],
              dtype='datetime64[ns, UTC]', name=u'date', freq=None)

Plus tard dans mon code, je récupère la zone pour des jours spécifiques en utilisant le format suivant: sub_dim_metrics['2017-04-02'], par exemple.

Avant de récupérer la zone pour un certain jour, je vérifie d'abord que la date demandée est dans la série, comme ceci: if '2017-04-02' in sub_dim_metrics.index

Mon problème est que la première valeur de l'index ne renvoie pas true, tandis que les autres le font:

>>> '2017-04-02' in sub_dim_metrics.index
True
>>> '2017-04-04' in sub_dim_metrics.index
False

Pourquoi cela et quelle est la meilleure façon de vérifier qu'une date est dans ma série avant de récupérer sa valeur correspondante?

3
KevinTydlacka 6 avril 2017 à 20:14

2 réponses

Meilleure réponse

IIUC:

Vous obtenez False au moment prévu True:
Vous vérifiez si une chaîne se trouve dans un index datetime. Apparemment pandas est lâche avec le chèque et essaie de le faire pour vous. Il se trompe cependant, n'est-ce pas.

plan 1
Fais-le bien!

pd.to_datetime('2017-04-04') in sub_dim_metrics.index

True

plan 2
Je pense que le non-trié le gâche. sort_values d'abord.

'2017-04-04' in sub_dim_metrics.index.sort_values()

True

setup

from io import StringIO
import pandas as pd

txt = """2017-04-04 00:00:00+00:00     32.38
2017-04-03 00:00:00+00:00    246.28
2017-04-02 00:00:00+00:00    146.25
2017-04-01 00:00:00+00:00    201.98
2017-03-31 00:00:00+00:00    274.74
2017-03-30 00:00:00+00:00    257.82
2017-03-29 00:00:00+00:00    279.38
2017-03-28 00:00:00+00:00    203.53
2017-03-27 00:00:00+00:00    250.65
2017-03-26 00:00:00+00:00    180.59
2017-03-25 00:00:00+00:00    196.61
2017-03-24 00:00:00+00:00    281.04
2017-03-23 00:00:00+00:00    276.44
2017-03-22 00:00:00+00:00    227.55
2017-03-21 00:00:00+00:00    267.59"""

sub_dim_metrics = pd.read_csv(StringIO(txt),
    sep='\s{2,}', engine='python',
    index_col=0, parse_dates=[0],
    header=None, names=['date', 'area'],
    squeeze=True)
3
piRSquared 6 avril 2017 à 17:51
  len(s.get_value('2017-04-02)) == 0
  False 

La clé existe.

  len(s.get_value('2015-01-01)) == 0
  True

La clé n'existe pas.

1
Scott Boston 6 avril 2017 à 17:38