web-dev-qa-db-ja.com

日付が列にない場合、read.xlsxが日付を読み取るのが間違っている

xlsxパッケージが日付を誤って読み取っています。私はここでよく似たQをすべて読み、インターネット上でスカウトをしましたが、列に日付以外のデータがある場合にOriginが変更されるこの特定の動作を見つけることができません。

ドロップボックスから取得できる小さなExcelスプレッドシートがあります。

https://www.dropbox.com/s/872q9mzb5uzukws/test.xlsx

3つの行と2つの列があります。最初は日付、2番目は数字です。 3行目は、日付列に「総計」があります。

最初の2行を_read.xlsx_で読み取り、最初の列が日付であると言うと、これは機能します。

_read.xlsx("./test.xlsx",head=FALSE,1,colClasses=c("Date","integer"),endRow=2)
          X1 X2
1 2014-06-29 49
2 2014-06-30 46
_

それらは確かにスプレッドシートの日付です。 3つの行すべてを読み取ってみると、何かがうまくいきません。

_read.xlsx("./test.xlsx",head=FALSE,1,colClasses=c("Date","integer"))
          X1    X2
1 2084-06-30    49
2 2084-07-01    46
3       <NA> 89251
Warning message:
In as.POSIXlt.Date(x) : NAs introduced by coercion
_

整数として読み込もうとすると、異なる整数が得られます。

_> read.xlsx("./test.xlsx",head=FALSE,1,colClasses=c("integer","integer"),endRow=2)
     X1 X2
1 16250 49
2 16251 46
> read.xlsx("./test.xlsx",head=FALSE,1,colClasses=c("integer","integer"))
     X1    X2
1 41819    49
2 41820    46
3    NA 89251
_

最初の整数はas.Date(s1$X1,Origin="1970-01-01")(Unix Epoch)を使用して正しく変換され、2番目の整数はas.Date(s2$X1, Origin="1899-12-30")(Excel Epoch)を使用して正しく変換されます。 1970を使用して2番目のロットを変換すると、2084の日付が取得されます。

だから:私は何か間違ったことをしていますか?整数として読み取るのが最善であり、NAがある場合はExcel Epochを使用して変換し、そうでない場合はUnixエポックを使用しますか?それともxlsxパッケージのバグですか?

xlsxバージョンはバージョン:0.5.1です

15
Spacedman

日付は整数として読み取ることができ、後でopenxlsx::convertToDate()関数を使用して日付に変換できます。

もっと ここ

11
Ali

XLConnectは、このかなり甘いものを処理できます。

test <- readWorksheetFromFile( "~/Downloads/test.xlsx", sheet = "Sheet1", header = FALSE )
test
                 Col1  Col2
1 2014-06-29 00:00:00    49
2 2014-06-30 00:00:00    46
3         Grand Total 89251

あなたが抱えている問題は明らかです。最初の列が混合タイプであるということです:characterPOSIXctXLConnectは各セルを正しく読み取ることができますが、列のすべてのセルを最も一般的なタイプ(この場合はcharacter)にキャストします。

str(test)
'data.frame':   3 obs. of  2 variables:
 $ Col1: chr  "2014-06-29 00:00:00" "2014-06-30 00:00:00" "Grand Total"
 $ Col2: num  49 46 89251
4
Beasterfield

あなたが抱えている問題は、Excelが1月から1900年までの日数を保存していることです。つまり、RがExcelファイルから読み取っている日数です。 Rで変換すると、1月1日から1970年までの日数に基づいて変換されます。最初にこれら2つの間の日数を引くと、うまくいくはずです。

2
Tracy