Преобразование строки в дату-время pandas - PullRequest
1 голос
/ 08 января 2020

Я извлекаю данные из API в pandas фрейм данных, значения индекса которого следующие: -

df.index=['Q1-2013',
 'Q1-2014',
 'Q1-2015',
 'Q1-2016',
 'Q1-2017',
 'Q1-2018',
 'Q2-2013',
 'Q2-2014',
 'Q2-2015',
 'Q2-2016',
 'Q2-2017',
 'Q2-2018',
 'Q3-2013',
 'Q3-2014',
 'Q3-2015',
 'Q3-2016',
 'Q3-2017',
 'Q3-2018',
 'Q4-2013',
 'Q4-2014',
 'Q4-2015',
 'Q4-2016',
 'Q4-2017',
 'Q4-2018']

Это список строковых значений. Есть ли способ преобразовать это в pandas datetime? Я исследовал несколько вопросов и ответов, и они об использовании pd.to_datetime, который работает, когда индекс имеет тип объекта. В этом примере значения индекса являются строками. Ожидаемый результат:

new_df=magic_function(df.index)
print(new_df.index[0])
01-2013

Хотите знать, как построить "magic_function". Заранее спасибо. Q1 - это квартал 1, то есть январь, Q2 - квартал 2, то есть апрель, а Q3 - квартал 3, то есть июль, Q4 - квартал 4, то есть октябрь

Ответы [ 3 ]

3 голосов
/ 08 января 2020

С помощью небольшого количества манипуляций для синтаксического анализа вы можете использовать pd.PeriodIndex и форматировать по желанию (причина в том, что ожидается формат %Y%q):

df.index = [''.join(s.split('-')[::-1]) for s in df.index]
df.index = pd.PeriodIndex(df.index, freq='Q').to_timestamp().strftime('%m-%Y')
print(df.index)

Index(['01-2013', '01-2014', '01-2015', '01-2016', '01-2017', '01-2018',
       '04-2013', '04-2014', '04-2015', '04-2016', '04-2017', '04-2018',
       '07-2013', '07-2014', '07-2015', '07-2016', '07-2017', '07-2018',
       '10-2013', '10-2014', '10-2015', '10-2016', '10-2017', '10-2018'],
      dtype='object')

Мы также можем получить необходимый формат, используя str.replace:

df.index = df.index.str.replace(r'(Q\d)-(\d+)', r'\2\1')
df.index = pd.PeriodIndex(df.index, freq='Q').to_timestamp().strftime('%m-%Y')
0 голосов
/ 08 января 2020

Вы можете сопоставить функцию с индексом: pandas .Index.map

quarter_months = {
    'Q1': 1,
    'Q2': 4,
    'Q3': 7,
    'Q4': 10,
}

def quarter_to_month_year(quarter_year):
    quarter, year = quarter_year.split('-')
    month_year = '%s-%s'%(quarter_months[quarter], year)
    return pd.to_datetime(month_year, format='%m-%Y')

df.index = df.index.map(quarter_to_month_year)

Это приведет к следующему результату:

DatetimeIndex(['2013-01-01', '2014-01-01', '2015-01-01', '2016-01-01',
               '2017-01-01', '2018-01-01', '2013-04-01', '2014-04-01',
               '2015-04-01', '2016-04-01', '2017-04-01', '2018-04-01',
               '2013-07-01', '2014-07-01', '2015-07-01', '2016-07-01',
               '2017-07-01', '2018-07-01', '2013-10-01', '2014-10-01',
               '2015-10-01', '2016-10-01', '2017-10-01', '2018-10-01'],
              dtype='datetime64[ns]', name='index', freq=None)
0 голосов
/ 08 января 2020

to_datetime() функция https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.to_datetime.html

Это объект datetime64 при применении to_datetime(), to_period() превращает его в объект периода, дальнейшие модификации, такие как to_timestamp().strftime('%m-%Y') превратить элементы индекса в строки:

import pandas as pd

df = pd.DataFrame(index=['Q1-2013',
 'Q1-2014',
 'Q1-2015',
 'Q1-2016',
 'Q1-2017',
 'Q1-2018',
 'Q2-2013',
 'Q2-2014',
 'Q2-2015',
 'Q2-2016',
 'Q2-2017',
 'Q2-2018',
 'Q3-2013',
 'Q3-2014',
 'Q3-2015',
 'Q3-2016',
 'Q3-2017',
 'Q3-2018',
 'Q4-2013',
 'Q4-2014',
 'Q4-2015',
 'Q4-2016',
 'Q4-2017',
 'Q4-2018'])

#    df_new = pd.DataFrame(index=pd.to_datetime(['-'.join(s.split('-')[::-1]) for s in df.index]))    
    df_new = pd.DataFrame(index=pd.to_datetime(['-'.join(s.split('-')[::-1]) for s in df.index]).to_period('M'))
#    df_new = pd.DataFrame(index=pd.to_datetime(['-'.join(s.split('-')[::-1]) for s in df.index]).to_period('M').to_timestamp().strftime('m-%Y'))


print(df_new.index)

PeriodIndex(['2013-01', '2014-01', '2015-01', '2016-01', '2017-01', '2018-01',
             '2013-04', '2014-04', '2015-04', '2016-04', '2017-04', '2018-04',
             '2013-07', '2014-07', '2015-07', '2016-07', '2017-07', '2018-07',
             '2013-10', '2014-10', '2015-10', '2016-10', '2017-10', '2018-10'],
            dtype='period[M]', freq='M')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...