【问题标题】:Conversion python dataframe character column to r with rpy2使用 rpy2 将 python 数据框字符列转换为 r
【发布时间】:2020-08-05 17:12:49
【问题描述】:

我正在尝试使用 rpy2 将 python 数据帧转换为 r,但我无法将 python 数据帧中的日期转换为 r 数据帧中的日期类型。

pd.to_datetime() 转换为 r 数据帧时,我没有得到正确的转换。

有问题的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.])

discharge_time 也是如此。

用字符串转换代码,然后尝试转换:

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

错误:

没有为“'

那么如何使用 rpy2 将 python 数据框中的日期转换为 r 中的日期?我需要日期格式,因为我稍后会进行日期计算,而字符串将不起作用。

版本:

熊猫==1.0.1

rpy2~=3.3.5

【问题讨论】:

    标签: python r rpy2


    【解决方案1】:

    您的问题与 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 端处理日期的乐趣了,请参阅 dates。此外,如果您碰巧使用 Jupyter 笔记本,使用 cell magics 进行转换会更方便。

    【讨论】:

      猜你喜欢
      • 2013-05-31
      • 2012-10-30
      • 2019-09-02
      • 2014-04-15
      • 2013-06-10
      • 2019-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多