Сравнение объекта даты и времени с элементами серии Panda - PullRequest
3 голосов
/ 23 апреля 2019

Я пытаюсь сравнить объект datetime с датой, хранящейся в серии Panda. Для каждого элемента в Серии, который соответствует переданному объекту datetime, этот элемент добавляется в массив. Спрос numpyfloat64.

date_chosen = dt.datetime(2019, 4, 2) 
raw_csv = pd.read_csv(data_series, sep=',', na_values=missing_values)

demand_s = pd.to_numeric(raw_csv['DEMAND'])          # extracts demand
date_series = pd.to_datetime(raw_csv['DATE'])        # extracts date

demand_needed = []                        # which demand values match the date_chosen
day = date_series.dt.day                  # only includes day 
for i in day:
    if day[i] == date_chosen.day:         # if element in day is same as chosen one
        demand_needed.append(demand_s[i]) # append matching element 

print(type(date_chosen.day))              # = int
print(type(day[2]))                       # = numpy.int64

Это работает нормально, но проблема в том, что require_needed [] пусто. Date_chosen.day - это стандартное int, а элементами day - numpyint64. Как мне сравнить int и numpyint64?

1 Ответ

4 голосов
/ 23 апреля 2019

В вашем цикле for, i - это значение каждой строки в Series "day", а не индекс. Таким образом, ваш цикл должен быть структурирован как:

date_chosen = dt.datetime(2019, 4, 2) 
raw_csv = pd.read_csv(data_series, sep=',', na_values=missing_values)

demand_s = pd.to_numeric(raw_csv['DEMAND'])
date_series = pd.to_datetime(raw_csv['DATE'])

demand_needed = []
day = date_series.dt.day
for idx, d in day.iteritems():
    if d == date_chosen.day:
        demand_needed.append(demand_s.iloc[idx])

Но лучшим решением IIUC будет использование boolean indexing вместо итерации:

demand_needed = raw_csv.loc[raw_csv.DATE.dt.day.eq(date_chosen.day), 'DEMAND']

Или, если вам нужен вывод как list вместо Series, используйте:

demand_needed = raw_csv.loc[raw_csv.DATE.dt.day.eq(date_chosen.day), 'DEMAND'].tolist()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...