在 rpy2 中使用 as.Date() 的意外行为

Unexpected behavior using as.Date() in rpy2

我在 Python 中有一些代码基于 R 包 (timeDate) 生成带有日期的数据框,但我无法将 date/time 仅转换为日期(排除时间部分)。

我试过使用 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 是一个函数,returns 指定年份之间所有圣诞节日期的向量。

date_str 正确地按照指定的格式输出。当 运行 直接在 R 中时,我得到的日期在所有四个 dt 列中都显示为 2025-12-25。我希望在 python 中与 rpy2 相同,但我在所有四列中得到的数字都像 20447.0。

由于 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,其中不包括时间部分。而是使用日期时间类型:as.POSIXct 或 non-time 区域版本,as.POSIXlt。这些似乎可以用 ropandas2ri 正确翻译。