Как установить переменную, равную месяцу и дню, а затем сделать с ней математику? - PullRequest
0 голосов
/ 25 марта 2019

Я работаю в Python с панелью данных панд. Фрейм данных содержит 4 столбца. Колонны, с которыми я работаю, - это год и урожай. Год - это год, когда произошло конкретное событие, а урожай - это количество дней до 31 августа, когда произошло это событие. В общем, если урожай равен 23, то событие произошло 23 сентября того же года.

Меня просят выяснить, когда, в частности, произошел более ранний сбор данных в наборе данных. Для справки, мой фрейм данных называется «MyData». Итак, я сначала определил самый ранний год, как так:

Earliest = MyData.loc[MyData['year'].idxmin()]

Теперь я не уверен, как использовать переменную 'урожай', чтобы вернуть определенную дату (только с месяцами и днями).

Я пытался определить переменную базовой даты, равную 8/31, а затем просто добавить переменную 'урожай' из этой базовой даты. Это линия, которую я сейчас имею:

BaseDate = pd.to_datetime("08/31",format="%m/%d")

Это возвращает намного больше, чем я хочу. Я просто хочу, чтобы он вернулся 31.08. Затем я бы использовал эту переменную BaseDate, чтобы сделать что-то вроде этого:

print("The harvest happened on", BaseDate + pd.DateOffset(days=Earliest['harvest']),"of that year.")

И должно получиться что-то вроде: «Урожай произошел 16 августа того года».

Вместо этого в настоящее время возвращается следующее: «Урожай произошел 1900-09-23 00:00:00 того года».

Вероятно, для меня было бы лучше создать целый новый столбец во фрейме данных, который выполняет эту математику для каждой строки. Я открыт для решения, которое делает это, и на самом деле предпочел бы это! Но пока, то, как я это представил, было бы достаточно.

Когда я пытаюсь создать новый столбец, я записываю его следующим образом:

MyData['Date'] = datetime.datetime(2000,8,31) + MyData['harvest']

или

MyData['Date'] = BaseDate + MyData['harvest']

Но он возвращает эту ошибку: «неподдерживаемые типы операндов для +:« datetime.datetime »и« float »»

1 Ответ

0 голосов
/ 25 марта 2019

Вы можете сделать это с помощью (BaseDate + pd.DateOffset(days=Earliest['harvest'])).strftime('%m/%d')

Обновлено Это работает

chk ['newColumn2'] = BaseDate + pd.to_timedelta (chk ['crop'], unit = 'd')

Я взял пример как

>>> chk = pd.DataFrame({'year':[1700,1701,1702,1703],
...                     'harvest':[42.5,35.9,45.0,49.4]})
>>> 
>>> chk['date']= pd.to_datetime(chk['year'],format='%Y') 
>>> chk['newColumn'] = chk['date'] + pd.to_timedelta(chk['harvest'],unit='d')
>>> chk
   harvest  year                date           newColumn
0     42.5  1700 1700-01-01 00:00:00 1700-02-12 12:00:00
1     35.9  1701 1701-01-01 00:00:00 1701-02-05 21:36:00
2     45.0  1702 1702-01-01 00:00:00 1702-02-15 00:00:00
3     49.4  1703 1703-01-01 00:00:00 1703-02-19 09:36:00

Используя нашу BaseDate, мы могли бы также выполнить

>>> BaseDate = pd.to_datetime("08/31",format="%m/%d")
>>> chk['newColumn2'] = BaseDate + pd.to_timedelta(chk['harvest'],unit='d')
>>> chk
   harvest  year                date           newColumn          newColumn2
0     42.5  1700 1700-01-01 00:00:00 1700-02-12 12:00:00 1900-10-12 12:00:00
1     35.9  1701 1701-01-01 00:00:00 1701-02-05 21:36:00 1900-10-05 21:36:00
2     45.0  1702 1702-01-01 00:00:00 1702-02-15 00:00:00 1900-10-15 00:00:00
3     49.4  1703 1703-01-01 00:00:00 1703-02-19 09:36:00 1900-10-19 09:36:00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...