#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