Примените DatetimeIndex в качестве фильтра для Dateframe со значениями datetime - PullRequest
1 голос
/ 18 апреля 2020

Хорошо, я только учусь работать с объектами DatetimeIndex и Dateframe. Я столкнулся с новой проблемой, с которой я не могу напрямую увидеть решение, и я надеялся, что у кого-то может быть элегантное решение с использованием pandas функций, о которых я, возможно, еще не знаю.

Ситуация следующим образом: С одной стороны, у меня есть очень большой Dataframe со множеством строк и нескольких столбцов, включая столбец с именем starttime , который имеет временные метки в качестве значений. Может быть две или более строк с одинаковым значением starttime .

                  starttime                 endtime  ...          y          x
id                                                   ...                      
0    2015-10-11 00:00:55+00  2015-10-11 00:00:55+00  ...          1      other
1    2015-10-11 15:10:42+00  2015-10-11 15:10:42+00  ...          1      other
2    2014-10-21 10:25:44+00  2014-10-21 10:25:44+00  ...          1      other
3    2014-10-21 10:27:28+00  2014-10-21 10:27:28+00  ...          1      other
4    2014-10-21 10:30:27+00  2014-10-21 10:30:27+00  ...          1      other
..                      ...                     ...  ...        ...        ...

С другой стороны, у меня есть объект DatetimeIndex, содержащий множество непересекающихся дат. Очень важно знать, что эти даты не образуют полного диапазона между датами A и B, поэтому между ними определенно есть «дыры», поэтому я не могу просто применить date_range.

DatetimeIndex(['2014-12-12', '2014-12-15', '2014-12-16', '2014-12-17',
               '2014-12-18', '2014-12-19', '2014-12-20', '2014-12-21',
               '2015-03-02', '2015-03-03',
               ...],
              dtype='datetime64[ns]', length=xyz, freq=None)

И здесь встает вопрос : Теперь мне нужно удалить все строки Dataframe на место, значение starttime которых не представлено с датой в DatetimeIndex. Время в h: m: s не имеет значения, поэтому если у меня есть дата «2014-12-12» и две строки «2014-12-12 00: 00: 55 + 00» и «2014-12-12 15: 10: 42 + 00 "оба должны быть включены. Получившийся обрезанный Dataframe должен также содержать все столбцы, которые у него были раньше.

Мой первый итеративный подход состоял в том, чтобы взять одну дату DatetimeIndex после другой и go через все строки Dataframe и скопировать строку если это в тот же день в новом кадре, но я подумал, что для этого должен быть лучший способ, поскольку у меня, очевидно, возникают серьезные проблемы с производительностью, если в кадре данных слишком много строк.

1 Ответ

1 голос
/ 18 апреля 2020

Удалить время на Series.dt.floor, сравнить на Series.isin и отфильтровать на boolean indexing:

#some value for match
idx = pd.DatetimeIndex(['2015-03-02', '2015-10-11'])

df['starttime'] = pd.to_datetime(df['starttime'])

df1 = df[df['starttime'].dt.floor('D').isin(idx)]
print (df1)
   id                 starttime                 endtime  y      x
0   0 2015-10-11 00:00:55+00:00  2015-10-11 00:00:55+00  1  other
1   1 2015-10-11 15:10:42+00:00  2015-10-11 15:10:42+00  1  other

Подробности :

print (df['starttime'].dt.floor('D'))
0   2015-10-11 00:00:00+00:00
1   2015-10-11 00:00:00+00:00
2   2014-10-21 00:00:00+00:00
3   2014-10-21 00:00:00+00:00
4   2014-10-21 00:00:00+00:00
Name: starttime, dtype: datetime64[ns, UTC]

print (df['starttime'].dt.floor('D').isin(idx))
0     True
1     True
2    False
3    False
4    False
Name: starttime, dtype: bool
...