Python Pandas вперед заполнить недостающие данные в указанном c временном диапазоне - PullRequest
1 голос
/ 08 мая 2020

У меня есть pandas фрейм данных, который выглядит следующим образом:

enter image description here

Как видите - в индексе datetime есть определенные минуты отсутствует. Например, на скриншоте между первой и второй строками отсутствуют минуты 9:16:00 - 9:19:00. Я хочу переслать данные с предыдущей минуты на все недостающие минуты.

Теперь мы подошли к той части, где все становится сложно, и к той части, с которой мне нужна помощь. Мне нужно только пересылать заполненные минуты между 09:15:00 и 15:30:00 каждого дня. И для любой строки, заполненной вперед, столбец Volume должен иметь значение 0

Чтобы помочь вам изучить данные, я экспортировал первые несколько строк в объект json. (я думаю, что индекс datetime преобразован в миллисекунды)

    {
  "1580464080000": {
    "expiry": "4/30/2020",
    "close": 12157.3,
    "high": 12157.3,
    "volume": 0,

    "open": 12157.3,
    "low": 12157.3,
    "timezone": "+05:30"
  },
  "1580463120000": {
    "expiry": "4/30/2020",
    "close": 12200.3,
    "high": 12200.3,
    "volume": 0,
    "open": 12200.3,
    "low": 12200.3,
    "timezone": "+05:30"
  },
  "1580464260000": {
    "expiry": "4/30/2020",
    "close": 12150.0,
    "high": 12150.0,

    "volume": 0,
    "open": 12150.0,
    "low": 12150.0,
    "timezone": "+05:30"
  },
  "1580462400000": {
    "expiry": "4/30/2020",
    "close": 12174.0,
    "high": 12174.0,
    "volume": 0,
    "open": 12174.0,
    "low": 12174.0,
    "timezone": "+05:30"
  },
  "1580462820000": {
    "expiry": "4/30/2020",
    "close": 12193.7,
    "high": 12193.7,
    "volume": 0,
    "open": 12193.7,
    "low": 12193.7,
    "timezone": "+05:30"
  },
  "1580462100000": {
    "expiry": "4/30/2020",
    "close": 12180.0,
    "high": 12180.0,
    "volume": 0,
    "open": 12180.0,
    "low": 12180.0,
    "timezone": "+05:30"
  },
  "1580464440000": {
    "expiry": "4/30/2020",
    "close": 12160.45,
    "high": 12160.45,
    "volume": 0,
    "open": 12160.45,
    "low": 12160.45,
    "timezone": "+05:30"
  }
}

1 Ответ

2 голосов
/ 08 мая 2020

Я предлагаю вам использовать метод pandas повторной выборки. Он преобразует фрейм данных в указанный формат. Шаги:

  1. Передискретизация с использованием метода pandas повторной выборки. «1T» - это минуты. Вы можете увидеть другие частоты здесь: https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#timeseries -offset-aliases

  2. Затем удалите ненужное время, то есть вне 9:15 до 15:30 с использованием between_time.

  3. Затем заполните NA для 'volume' значением 0 и вперёд заполните оставшиеся столбцы.

  4. Заполнить оставшиеся столбцы вперед

Вот пример кода:

# Get unique dates from the data frame
df['Date'] = df.index.date
sample_days = df['Date'].unique()

# Resample to 1 minute and keep only the original dates
df = df.resample('1t').last()
df = df.loc[df['Date'].isin(sample_days)]

# Remove non open hours
df = df.between_time('09:15', '15:30')

# Fill 0 in Na for volume
df['volume'] = df['volume'].fillna(0)

# Forward fill the remaining columns (notice, as NAs in volume are removed, it does effect this column)
df = df.fillna(method='ffill')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...