Удалять кусочек секунд с каждой минуты в pandas - PullRequest
0 голосов
/ 22 апреля 2020

Мне было интересно, как можно убрать кусок времени из большей единицы времени. Допустим, у нас есть набор данных за день, и мы хотим удалить первые 10 секунд каждой минуты с этого дня. Как я могу сделать это в Pandas или Numpy?

В примере показаны значения в диапазоне 15 минут, а значения между 06 и 10 часами утра удалены. Это должно происходить каждый день в наборе данных. Я надеюсь, что вы можете помочь мне.

Before:
2019-01-01 05:15:00    0.0
2019-01-01 05:30:00    0.0
2019-01-01 05:45:00    0.0
2019-01-01 06:00:00    0.0
2019-01-01 06:15:00    0.0

After:
2019-01-01 05:15:00    0.0
2019-01-01 05:30:00    0.0
2019-01-01 05:45:00    0.0
2019-01-01 10:15:00    0.0
2019-01-01 10:30:00    0.0

Спасибо.

РЕДАКТИРОВАТЬ:

Я попробовал это, и это сработало:

#The actual deleting of the rows between 6am and 10 am
def delete_row_by_time(df, day):
  from_ts = day + ' 06:00:00'
  to_ts = day +  ' 10:00:00'
  df = df[(df.index < from_ts) | (df.index > to_ts)]
  return df

#Get the actual days
days = eins.index.strftime('%Y-%m-%d').unique()
days = pd.to_datetime(days)

start_date = days.min()
end_date = days.max()
delta = datetime.timedelta(days=1)

#iterate through all days in dataset
while start_date <= end_date:
  print(start_date)
  df = delete_row_by_time(df, str(start_date))
  start_date += delta

Может быть Есть некоторые улучшения, которые нужно сделать.

1 Ответ

0 голосов
/ 22 апреля 2020

Предыдущие решения не работали, потому что у вас нет столбца DateTime, но есть DateTimeIndex, поэтому синтаксис немного отличается.

Ваше решение работает, однако это можно решить с помощью pandas функция, которая векторизуется, поэтому вам не нужно go день за днем ​​в for/while l oop

from datetime import datetime

np.random.seed(0)
index = pd.date_range(datetime.now(), freq='15T', periods=1000)
sample_data = np.random.rand(1000)

df = pd.DataFrame(dict(data=sample_data), index=index)

df = df[(df.index.hour < 6 ) | ((df.index.hour >= 10) & (df.index.minute > 0))]

df.iloc[20:26]

#       data
# 2020-04-22 05:00:00   0.978618
# 2020-04-22 05:15:00   0.799159
# 2020-04-22 05:30:00   0.461479
# 2020-04-22 05:45:00   0.780529
# 2020-04-22 10:15:00   0.437032
# 2020-04-22 10:30:00   0.697631

Это решение будет удалять каждый час с 6 до 10 утра, включая 10: 00: 00

...