Преобразование python символьный столбец dataframe в r с помощью rpy2 - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь преобразовать кадр данных python в r с помощью rpy2, и я не могу получить дату в кадре данных python для преобразования в тип даты в кадрах данных r.

При преобразовании pd.to_datetime() to r dataframe Я не получаю правильного преобразования.

рассматриваемые столбцы даты df:

     event_time
0    2019-10-11
1    2020-01-01
2    2019-11-15
3    2020-03-05

Код преобразования:

with localconverter(ro.default_converter + pandas2ri.converter):

    df['event_time'] = pd.to_datetime(df['event_time']).dt.strftime("%Y-%m-%d")
    df["event_time"] = pd.to_datetime(df["event_time"]).dt.date
    r_df = ro.conversion.py2rpy(df)

Производит:

event_time: <class 'numpy.ndarray'>
  array([737343., 737425., 737378., 737489.])

То же самое и для времени разряда.

Код преобразования со строкой, а затем попытка преобразования:

with localconverter(ro.default_converter + pandas2ri.converter):

    df['event_time'] = pd.to_datetime(df['event_time']).dt.strftime("%Y-%m-%d")
    #### df["event_time"] = pd.to_datetime(df["event_time"]).dt.date
    r_df = ro.conversion.py2rpy(df)

    r_df = base.cbind(r_df, event_time = base.as_Date(r_df[r_df.names.index('event_time')], '%Y-%m-%d'))

Создает фрейм данных с:

event_time: <class 'numpy.ndarray'>
  array(['2019-10-11', '2020-01-01', '2019-11-15', '2020-03-05'], dtype='<U10')

Но эта строка кода r_df = base.cbind(r_df, event_time = base.as_Date(r_df[r_df.names.index('event_time')], '%Y-%m-%d')) ошибки с:

AttributeError: объект 'numpy .ndarray' не имеет атрибута 'index'

Использование этого кода создает:

with localconverter(ro.default_converter + pandas2ri.converter):

    df['event_time'] = pd.to_datetime(df['event_time']).dt.strftime("%Y-%m-%d")
    #### df["event_time"] = pd.to_datetime(df["event_time"]).dt.date
    r_df = ro.conversion.py2rpy(df)

    r_df = base.cbind(r_df, event_time = base.as_Date(r_df[r_df.rx2('event_time')], '%Y-%m-%d'))

Ошибка:

Преобразование py2rpy не определено для объектов типа ' '

Итак, как мне получить дату из фрейма данных python в дату в r с помощью rpy2? Мне он нужен в формате даты, потому что позже я буду выполнять расчеты даты, и строки не будут работать.

Версии:

pandas == 1.0.1

rpy2 ~ = 3,3,5

1 Ответ

1 голос
/ 10 августа 2020

Ваша проблема не имеет ничего общего с rpy2, вы просто неправильно разбираете даты в pandas. См.:

from pandas import DataFrame, to_datetime

df = DataFrame(dict(event_time=['2019-10-11', '2020-01-01']))

df.event_time = to_datetime(df.event_time)

print(list(df.event_time))
# [Timestamp('2019-10-11 00:00:00'), Timestamp('2020-01-01 00:00:00')]

# you using dt.strftime you was just converting them back to strings, see:
print(list(df.event_time.dt.strftime("%Y-%m-%d")))
# ['2019-10-11', '2020-01-01', '2019-11-15']

# now you could extract date object (but don't! timestamps are fine for rpy2)
print(list(df.event_time.dt.date))
# [datetime.date(2019, 10, 11), datetime.date(2020, 1, 1)]

Теперь в rpy2 вы просто выполняете:

from rpy2.robjects import conversion, default_converter, pandas2ri
from rpy2.robjects.conversion import localconverter


with localconverter(default_converter + pandas2ri.converter):
    df_r = conversion.py2rpy(df)

print(repr(df_r.rx2('event_time')))
# R object with classes: ('POSIXct', 'POSIXt') mapped to:
# [2019-10-11, 2020-01-01]

Теперь вы можете получить удовольствие от обработки дат на стороне R, см. date . Кроме того, если вы используете записные книжки Jupyter, преобразование намного удобнее с использованием магии ячеек .

...