#rpy2
#rpy2
Вопрос:
У меня есть rpy2 dataframe, сопоставленный с датами в виде символьных столбцов, потому что мне не нужны столбцы POSIXt / ct. Я предположил, что затем смогу преобразовать этот символьный столбец в дату, и он будет находиться внутри r_df, но вместо этого я получаю значение с плавающей точкой
Настройка:
from rpy2.robjects.packages import importr
base = importr("base")
Краткий пример:
> base.as_Date('2020-01-01')
R object with classes: ('Date',) mapped to:
[18262.000000]
> base.as_Date('2020-01-01', format='%Y-%m-%d')
R object with classes: ('Date',) mapped to:
[18262.000000]
Мой фактический фрейм данных:
> r_df
R object with classes: ('data.frame',) mapped to:
[IntSexpVe..., IntSexpVe..., IntSexpVe..., FloatSexp..., ..., StrSexpVe..., StrSexpVe..., StrSexpVe..., StrSexpVe...]
....
> r_df[i]
R object with classes: ('character',) mapped to:
['2016-11-..., '2020-02-..., '2020-07-..., '2019-01-..., ..., '2020-01-..., '2017-01-..., '2020-01-..., '2020-01-...]
> base.as_Date(r_df[i], format = "%Y-%m-%d")
R object with classes: ('Date',) mapped to:
[17106.000000, 18293.000000, 18444.000000, 17897.000000, ..., 18262.000000, 17167.000000, 18262.000000, 18262.000000]
Еще одна попытка с тем же фреймом данных:
> r_df.rx2(col_name)
R object with classes: ('character',) mapped to:
['2016-11-..., '2020-02-..., '2020-07-..., '2019-01-..., ..., '2020-01-..., '2017-01-..., '2020-01-..., '2020-01-...]
> base.as_Date(r_df.rx2(col_name), '%Y-%m-%d')
R object with classes: ('Date',) mapped to:
[17106.000000, 18293.000000, 18444.000000, 17897.000000, ..., 18262.000000, 17167.000000, 18262.000000, 18262.000000]
Последняя попытка заключалась в попытке преобразовать из POSIXt / ct в Date, думая, что, возможно, это позволит более точно проанализировать:
> r_df.rx2(col_name)
R object with classes: ('POSIXct', 'POSIXt') mapped to:
[2016-11-01, 2020-02-01, ..., 2020-01-01, 2020-01-01, 2017-01-01, 2020-01-01]
> base.as_Date(r_df.rx2(col_name), '%Y-%m-%d')
R object with classes: ('Date',) mapped to:
[17106.000000, 18293.000000, 18444.000000, 17897.000000, ..., 18262.000000, 17167.000000, 18262.000000, 18262.000000]
Выполнение в r studio и каковы мои ожидания:
> as.Date('2020-01-01')
[1] "2020-01-01"
Мне это не кажется правильным. Я использовал конвертер rpy2 для преобразования python pandas df в r фрейм данных. Я не выполняю код за пределами преобразователя по умолчанию. Есть идеи, как решить эту проблему и правильно преобразовать строку
Версии:
pandas ==1.0.1
rpy2~= 3.3.5
R == 4.0.0
Ответ №1:
В R Date
объекты представляют собой (массивы) плавающих значений с тегом, сообщающим R, что они являются датами.
>>> dt = base.as_Date('2020-01-01')
>>> dt
R object with classes: ('Date',) mapped to:
[18262.000000]
Однако при использовании собственной печати R:
>>> print(dt)
[1] "2020-01-01"
В то время как на уровне C-API R это значение с плавающей точкой
>>> dt.typeof
<RTYPES.REALSXP: 14>
существует атрибут класса R, который сообщает R, что это дата.
>>> tuple(dt.rclass)
('Date',)