Пересечение фрагмента фрейма данных и списка

#python #pandas #datetime

#python #pandas #дата — время #дата-время

Вопрос:

Я пытаюсь выбрать подраздел фрейма данных, используя .loc как таковой:

 for date in months.index:
   labels = list(df.index.values)
   X = df.loc[(date - relativedelta(months= 3)):date.intersection(labels), ['A', 'B']]
   Y = df.loc[(date - relativedelta(months= 3)):date.intersection(labels), 'C']
   months.at[date, 'Prediction'] = forest.fit(X, Y)
  

Я следую методу, предложенному в https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#deprecate-loc-reindex-listlike но я сталкиваюсь с ошибкой

 AttributeError: 'Timestamp' object has no attribute 'intersection'
  

Это проблема, потому что я использую фрейм данных с временной индексацией, потому что я пересекаюсь с фрагментом фрейма данных, а не со всем индексом, или другая проблема? Я пытался преобразовать временные метки в объекты datetime, но безрезультатно.

Комментарии:

1. Какова ваша цель здесь. Чтобы пересечь столбцы a,b за 3 месяца, предшествующих какой дате? В любом случае, это то, что написано на жестянке. date.intersection(labels) дата не имеет атрибута пересечения.

2. Я отредактировал код, чтобы он был более понятным. Я просматриваю месяцы фрейма данных (в месяцах df в качестве индексов указан первый день месяца).

3. Вопрос в том, что мне использовать вместо этого, если я хочу выбирать только допустимые значения? Проблема в том, что фрейм данных отсутствует несколько дней, поэтому, если я не использую что-то вроде ‘intersection’, возникает ошибка, в которой говорится, что я передаю что-то с отсутствующими метками в .loc.

4. Даже если date был индекс, чтобы вы могли позвонить date.intersection … вы не можете использовать это как остановку среза, вам нужно срезать с .loc[date_start:date_stop, ...

5. df индексируется по датам. значение date_start должно быть 3 месяца назад, а значение date_stop должно быть текущей датой. Я знаю, что мне нужно вызвать пересечение на самом фрагменте, есть ли способ сделать это? просто заключить фрагмент в круглые скобки не работает.

Ответ №1:

 #import librarys
import pandas as pd
import numpy as np
import datetime

#get today
today = datetime.datetime.now()

print(today)
  

вывод:

datetime.datetime(2020, 8, 26, 20, 25, 40, 480870)

Затем определите даты, с которых вы хотите работать, 90 дней проще.

 #get date back 90 days
date_from = today - pd.to_timedelta(90,"D")

#create a mock DF

dates_this_year = pd.date_range("2020-01-01",datetime.datetime.now().strftime("%Y-%m-%d"))
mock_values = np.arange(0,len(dates_this_year))
df = pd.DataFrame({"date":dates_this_year,"A":mock_values,"B":mock_values,"C":mock_values})
date_df = df.set_index("date")

date_df
  

вывод:

 date        A   B   C       

2020-01-01  0   0   0
2020-01-02  1   1   1
2020-01-03  2   2   2
2020-01-04  3   3   3
2020-01-05  4   4   4
... ... ... ...
2020-08-22  234 234 234
2020-08-23  235 235 235
2020-08-24  236 236 236
2020-08-25  237 237 237
2020-08-26  238 238 238
  

Затем, чтобы проиндексировать его, просто используйте дату от и до.

date_df.loc[date_from:today,["A","B"]]

вывод:

 date        A   B   
2020-05-29  149 149
2020-05-30  150 150
2020-05-31  151 151
2020-06-01  152 152
2020-06-02  153 153
... ... ...
2020-08-22  234 234
2020-08-23  235 235
2020-08-24  236 236
2020-08-25  237 237
2020-08-26  238 238