Кажется, не удается сопоставить метку времени с созданным диапазоном дат в python - PullRequest
0 голосов
/ 03 декабря 2018

Я относительно новичок в кодировании и пытаюсь объединить столбец даты и времени с созданным диапазоном дат в пандах.

Я пытаюсь сопоставить столбец даты и времени StartDate (из DataFrame energy), который был помещен в переменную start_dates, с созданным DatetimeIndex с именем timeline, чтобы у меня был временной ряд.Это выглядит так:

In [1]: start_dates
Out[1]: 
0        2016-06-25 00:00:00
1        2016-06-26 00:00:00
2        2016-06-27 00:00:00

rates - это DataFrame с серией тарифов, которые я пытаюсь включить, чтобы предоставить информацию о тарифах за конкретное время, добавив start_dates:

In [2]: rates
Out[2]: 
   Rate1  
0  4.8 
1  5.9  
2  2.6  

Я пытался сопоставить отметку времени в start_dates с диапазоном дат в timeline.

Я пробовал все возможные способы, включая join / merge / insert / concat/ append / assign, но не могу заставить их слиться.

Моя последняя попытка:

timeline = pd.date_range('2007-03', '2022-06') #231 months
timeline = timeline.to_frame([timeline])

start_dates = energy.loc[:, 'StartDate']
start_dates = datetime.datetime.strptime(first_thous[:, 'StartDate'], '%Y-%m-%d').date()

rates = energy.loc[:, 'Rate1']
start_dates.append(rates)

timeline = timeline.reset_index(drop = True)
timeline.join(start_dates, how = 'inner')
print(timeline)

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

Кто-нибудь знает, что здесь происходит?

Ожидаемый результат будет:

In [3]: timeline
Out[3]:
             Rate1
0 2016-06-25 4.8
1 2016-06-26 5.9
2 2016-06-27 2.6

Спасибо.

1 Ответ

0 голосов
/ 12 декабря 2018

Вы можете использовать:

energy = pd.DataFrame({'Rate1':[4.8,5.9,2.6],
                       'StartDate':['2007-02-28 00:00:00',
                                    '2007-03-01 00:00:00',
                                    '2007-03-02 00:00:00']})
print (energy)
   Rate1            StartDate
0    4.8  2007-02-28 00:00:00
1    5.9  2007-03-01 00:00:00
2    2.6  2007-03-02 00:00:00


timeline = pd.date_range('2007-03', '2022-06')
print (timeline)
DatetimeIndex(['2007-03-01', '2007-03-02', '2007-03-03', '2007-03-04',
               '2007-03-05', '2007-03-06', '2007-03-07', '2007-03-08',
               '2007-03-09', '2007-03-10',
               ...
               '2022-05-23', '2022-05-24', '2022-05-25', '2022-05-26',
               '2022-05-27', '2022-05-28', '2022-05-29', '2022-05-30',
               '2022-05-31', '2022-06-01'],
              dtype='datetime64[ns]', length=5572, freq='D')

Не выбирать столбцы для разделения Series или DataFrames, просто конвертировать столбец StartDate to_datetime, а затем фильтровать по boolean indexing с isin:

energy['StartDate'] = pd.to_datetime(energy['StartDate'])
df = energy[energy['StartDate'].isin(timeline)]
print (df)
   Rate1  StartDate
1    5.9 2007-03-01
2    2.6 2007-03-02

РЕДАКТИРОВАТЬ: Другое решение:

energy['StartDate'] = pd.to_datetime(energy['StartDate'])
df = pd.DataFrame({'StartDate':timeline}).merge(energy)
print (df)
   StartDate  Rate1
0 2007-03-01    5.9
1 2007-03-02    2.6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...