Неожиданное поведение при использовании as.Date () в rpy2 - PullRequest
2 голосов
/ 09 мая 2019

У меня есть некоторый код в Python, который генерирует фрейм данных с датами на основе пакета R (timeDate), но я не могу преобразовать дату / время только в дату (исключая часть времени).

Я попытался использовать as.Date и вместо генерации даты генерирует число.Я запустил тот же код в R напрямую (убедившись, что это тот, что использует rpy2), и он правильно генерирует даты.Но в rpy2 это не работает.Версия R - 3.5.1, а Python - 3.7.0.

import rpy2.robjects as ro
from rpy2.robjects import pandas2ri
pandas2ri.activate()

ro.r('library(timeDate)')
ro.r('df <- data.frame(holiday="USChristmasDay", date=USChristmasDay(2010:2025))')
ro.r("names(df) <- c('holiday', 'date')")
ro.r("df$year = as.integer(format(df$date, '%Y'))")
ro.r("df$date_str = format(df$date, '%Y-%m-%d')")
ro.r("df$date_dt = as.Date(df$date, '%Y-%m-%d')")
ro.r("df$date_dt2 = as.Date(df$date_str, '%Y-%m-%d')")
ro.r("df$date_dt3 = as.Date(format(df$date, '%Y-%m-%d'), '%Y-%m-%d')")
ro.r("df$date_dt4 = as.Date(df$date, tz='America/Los_Angeles')")
df = ro.r('df')
print(df)

USChristmasDay - это функция, которая возвращает вектор всех дат Рождества между указанными годами.

Date_str правильно отображается в указанном формате.При непосредственном запуске в R я получаю даты, которые отображаются как 2025-12-25 во всех четырех столбцах dt.Я ожидаю того же в python с rpy2, но вместо этого я получаю числа типа 20447.0 во всех четырех столбцах.

1 Ответ

0 голосов
/ 10 мая 2019

Поскольку код R работал, используйте его непосредственно внутри Python, а не в интерфейсе ro.

from rpy2.robjects.packages import importr

base = importr("base")
timeDate = import("timeDate")

df = base.data_frame(holiday="USChristmasDay", date=timeDate.USChristmasDay(base.seq(2010,2025)))

df = base.cbind(df, year = base.as_integer(base.format(df[df.names.index('date')], "%Y")))
df = base.cbind(df, date_str = base.format(df[df.names.index('date')], '%Y-%m-%d'))
df = base.cbind(df, date_dt = base.as_Date(df[df.names.index('date')], '%Y-%m-%d'))
df = base.cbind(df, date_dt2 = base.as_Date(df[df.names.index('date_str')], '%Y-%m-%d'))
df = base.cbind(df, date_dt3 = base.as_Date(base.format(df[df.names.index('date')], '%Y-%m-%d'), '%Y-%m-%d'))
df = base.cbind(df, date_dt4 = base.as_Date(df[df.names.index('date')], tz='America/Los_Angeles'))

print(df)

Кроме того, преобразование чисел, по-видимому, связано с использованием as.Date, который не включает компонент времени. Вместо этого используйте типы datetime: as.POSIXct или версия без часового пояса, as.POSIXlt. Похоже, они правильно переводятся с ro и pandas2ri.

...