【发布时间】:2019-08-29 21:28:56
【问题描述】:
考虑这个简单的例子
import pandas as pd
mydata = pd.DataFrame({'mytime': [pd.to_datetime('2018-01-01 10:00:00.513'),
pd.to_datetime('2018-01-03 10:00:00.513')],
'myvariable': [1,2],
'mystring': ['hello', 'world']})
mydata
Out[7]:
mystring mytime myvariable
0 hello 2018-01-01 10:00:00.513 1
1 world 2018-01-03 10:00:00.513 2
我知道我可以使用Pandas 将该数据帧写入msgpack:
mydata.to_msgpack('C://Users/john/Documents/mypack')
问题是:如何读取R 中的msgpack 文件?
使用RcppMsgPack会返回一些不是dataframe/tibble的令人费解的输出
library(tidyverse)
library(RcppMsgPack)
df <- msgpack_read('C://Users/john/Documents/mypack', simplify = TRUE)
> df
$axes
$axes[[1]]
$axes[[1]]$typ
[1] "index"
$axes[[1]]$name
NULL
$axes[[1]]$klass
[1] "Index"
$axes[[1]]$compress
NULL
$axes[[1]]$data
[1] "mystring" "mytime" "myvariable"
$axes[[1]]$dtype
[1] "object"
$axes[[2]]
$axes[[2]]$typ
[1] "range_index"
$axes[[2]]$name
NULL
$axes[[2]]$klass
[1] "RangeIndex"
$axes[[2]]$start
[1] 0
$axes[[2]]$step
[1] 1
$axes[[2]]$stop
[1] 2
$typ
[1] "block_manager"
$blocks
$blocks[[1]]
$blocks[[1]]$shape
[1] 1 2
$blocks[[1]]$klass
[1] "IntBlock"
$blocks[[1]]$compress
NULL
$blocks[[1]]$values
[1] 01 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00
attr(,"EXT")
[1] 0
$blocks[[1]]$locs
$blocks[[1]]$locs$typ
[1] "ndarray"
$blocks[[1]]$locs$dtype
[1] "int64"
$blocks[[1]]$locs$compress
NULL
$blocks[[1]]$locs$ndim
[1] 1
$blocks[[1]]$locs$data
[1] 02 00 00 00 00 00 00 00
attr(,"EXT")
[1] 0
$blocks[[1]]$locs$shape
[1] 1
$blocks[[1]]$dtype
[1] "int64"
$blocks[[2]]
$blocks[[2]]$shape
[1] 1 2
$blocks[[2]]$klass
[1] "DatetimeBlock"
$blocks[[2]]$compress
NULL
$blocks[[2]]$values
[1] 40 02 0e 64 4d a7 05 15 40 02 ac 86 76 44 06 15
attr(,"EXT")
[1] 0
$blocks[[2]]$locs
$blocks[[2]]$locs$typ
[1] "ndarray"
$blocks[[2]]$locs$dtype
[1] "int64"
$blocks[[2]]$locs$compress
NULL
$blocks[[2]]$locs$ndim
[1] 1
$blocks[[2]]$locs$data
[1] 01 00 00 00 00 00 00 00
attr(,"EXT")
[1] 0
$blocks[[2]]$locs$shape
[1] 1
$blocks[[2]]$dtype
[1] "datetime64[ns]"
$blocks[[3]]
$blocks[[3]]$shape
[1] 1 2
$blocks[[3]]$klass
[1] "ObjectBlock"
$blocks[[3]]$compress
NULL
$blocks[[3]]$values
[1] "hello" "world"
$blocks[[3]]$locs
$blocks[[3]]$locs$typ
[1] "ndarray"
$blocks[[3]]$locs$dtype
[1] "int64"
$blocks[[3]]$locs$compress
NULL
$blocks[[3]]$locs$ndim
[1] 1
$blocks[[3]]$locs$data
[1] 00 00 00 00 00 00 00 00
attr(,"EXT")
[1] 0
$blocks[[3]]$locs$shape
[1] 1
$blocks[[3]]$dtype
[1] "object"
$klass
[1] "DataFrame"
我该怎么办?
当然,从 R 回到 Python 也不错。谢谢!
【问题讨论】:
-
它的超长。让我看看我能不能做到
-
@Parfait 完成了我的男人\
-
是的,看起来是 Pythonic 元素:dtype, ndarray....很好奇,相同的 R 数据如何与 msgpack 看?可以在 Pandas 中读取吗?
-
@Parfait 这是一个有趣的观点。我不知道。但也许我们可以先从等式的那一边开始:)
-
显然,
pandasDataFrame 的msgpack表示级别非常低,因此它不能按原样转换为适合 R 的对象。您要么编写一些代码将RcppMsgPack输出转换为R data.frame,要么更改生成msgpack文件的过程。后一种解决方案当然要好得多:生成只能用特定语言读取的输出是一种非常糟糕的做法。
标签: python r pandas tibble msgpack