Как запретить ключи, отличные от меток времени в DatetimeIndex? - PullRequest
0 голосов
/ 28 марта 2019

Pandas не ограничивает ключи DatetimeIndex только временными метками. Почему это так и есть ли способ сделать такое ограничение?

df = pd.DataFrame({"A":{"2019-01-01":12.0,"2019-01-03":27.0,"2019-01-04":15.0},
                   "B":{"2019-01-01":25.0,"2019-01-03":27.0,"2019-01-04":27.0}}
                 )
df.index = pd.to_datetime(df.index)
df.loc['2010-05-05'] = 1 # string index
df.loc[150] = 1 # integer index
print(df)

Я получаю следующий фрейм данных:

                        A     B
2019-01-01 00:00:00  12.0  25.0
2019-01-03 00:00:00  27.0  27.0
2019-01-04 00:00:00  15.0  27.0
2010-05-05            1.0   1.0
150                   1.0   1.0

Конечно, я не могу

df.index = pd.to_datetime(df.index)

еще раз из-за последних двух строк. Однако я хотел бы, чтобы 2 последние строки не могли быть добавлены с ошибкой. Возможно ли это?

Ответы [ 2 ]

1 голос
/ 28 марта 2019

У вас есть небольшое представление о типе вашего index. Это не a DateTimeIndex:

>>> df.index
Index([2019-01-01 00:00:00, 2019-01-03 00:00:00, 2019-01-04 00:00:00,
              '2010-05-05',                 150],
      dtype='object')

Индекс становится Object индексом dtype, как только вы добавляете значение другого типа. DateTimeIndex не может иметь типы временных меток, тип индекса изменен.


Если вы хотите удалить все значения, которые не являются датами и временем из вашего индекса, вы можете сделать это с помощью pd.to_datetime и errors='coerce'

df.index = pd.to_datetime(df.index, errors='coerce')

               A     B
2019-01-01  12.0  25.0
2019-01-03  27.0  27.0
2019-01-04  15.0  27.0
2010-05-05   1.0   1.0
NaT          1.0   1.0

Чтобы получить доступ только к элементам, которые имеют действительный Timestamp в качестве индекса, вы можете использовать notnull:

df[df.index.notnull()]

               A     B
2019-01-01  12.0  25.0
2019-01-03  27.0  27.0
2019-01-04  15.0  27.0
2010-05-05   1.0   1.0
0 голосов
/ 28 марта 2019

Вы можете проверить, является ли каждый индекс экземпляром pd._libs.tslibs.timestamps.Timestamp:

flags = [isinstance(idx, pd._libs.tslibs.timestamps.Timestamp) for idx in df.reset_index()['index']]
df = df[flags]

Тем не менее, обратите внимание, что вы, безусловно, можете сделать и pd.to_datetime('2010-05-05'), и pd.to_datetime(150). По крайней мере, они по-прежнему приводят к правильной отметке даты и времени, не выдавая исключение / ошибку /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...