Rpy2 base.as_Date преобразование столбца символьного фрейма данных в столбец даты

#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',)