2017-12-07 7 views
1

すべてが同じ列を含む多くのExcelファイルを取得しました。列の1つを「DateTime」と呼びます。問題は、この列にさまざまな形式が含まれていることです。たとえば、次のようになります。最初の例には最後にPMが含まれています。特定のフォルダ内のすべてのExcelファイルをインポートするための私のコードは異なる日付タイプのExcelファイルをインポート

file.list <- list.files(pattern='*.xlsx') 
df.list <- lapply(file.list, read_excel) 
df <- bind_rows(df.list, .id = "id") 

しかし、私は2番目の行(df.list <- lapply(file.list, read_excel))を実行した後、私は、(数字の期待のような警告を得ました。ここに私の問題がありますデート)。

col_types = "text"(私はすべてのデータを文字としてインポートすることを望みましたが、最後にPMを削除して文字をas.Dateに再度変更するなど)を試しました。しかし、残念なことに結果は多くのNAでした。

私が試したもう一つは、数値としてファイルをインポートすることでした(しかし、再び、数字の期待」同じメッセージを受信し、日付を得た)。

だから、どのように私はこの問題に取り組むことができますか?私はそれを行うことができます列を変更することにより、Excelで入力し、それは私が(私はRに全力を尽くすことを好む)何をしたいのかではありません。

編集

一部のデータを要求したとして、(私はRにデータをインポートした後、示唆されているように、as_date関数の「文字」として)。

Num Date 
1 41277.000601851854 
2 41277.004710648151 
3 41277.004826388889 
4 41277.007372685184 
5 41277.007789351854 
6 41277.007870370369 
7 41277.010335648149 
8 41277.010868055557 
9 41277.013842592591 
10 41277.014548611114 

答えて

2

lubridate、優れたparse_date_time機能を持っていますが、例えば、日/月/年も「切り捨て」の注文を指定することができますいくつかのフォーマットに番号がないことを許します。

library(lubridate) 

time <- c("2/12/2013 11:59:45 PM", "20/2/2013 14:36:58") 
parse_date_time(time, orders = c('dmyHMS')) 

[1] "2013-12-02 11:59:45 UTC" "2013-02-20 14:36:58 UTC" 
+0

ありがとうございました。さまざまな種類の日付を処理する1つの部分で動作します。しかし、私はまだRでデータをインポートするのに苦労しました。あなたはそれがどのように解決できるか考えていますか? –

+0

私はExcelファイルを避けようとする傾向があります。そのファイルを開いて.csvファイルとして保存することはできますか?不可能な場合は、 'readxl'パッケージと' xlsx'パッケージの 'read.xlsx'を見てください。以前は両方で使用されていましたが、 'readxl'に固執する傾向があります – sorearm

1

すべてのデータを最初にchar文字列として読み取ると、後で簡単にクリーニングできます。

次に、私はlubridateパッケージがあなたに役立つと思います。私はあなたが持っているどのように多くのファイル/フォーマット知らないが、与えられた例は、同じlubridate::dmy_hms()機能で読み取ることができます:

# >datim <- c("20/2/2013 14:36:58", "2/12/2013 11:59:45 PM") 
# >dmy_hms(datim) 
# [1] "2013-02-20 14:36:58 UTC" "2013-12-02 23:59:45 UTC" 

時間単位の各発注するための機能があります。例えばmdy_hm()である。時間形式にバリエーションがある場合は、stringr::str_detect(your_date_variable, "date_format_regex")を使用して、適切なdmy_hm()関数を適用する前に各形式の書式の行を識別します。

+0

データをchar文字列として読み込もうとしましたが、" col_type "の唯一のオプションは" skip "、" guess "、" logical "、" numeric "、"日付 "、"テキスト "、または"リスト "のいずれかです。 私は間違っていると思うが、私は文字==テキストだと思った。しかし、結果になるような値は、変更されています のDateTime 41277.000601851854と 41277.004710648151 そして、私は、関数as.Date(日時)でこれをバック変換する場合、私は私が持っている年は見なく、得た:「2083 -01-05 " –

+0

申し訳ありません" text "は文字列用です。数字41277.000 /は、1990年1月1日以降の日数を表します。あなたは 'as_date(" 1900-01-01 ")+秒(41277.000601851854 * 24 * 60 * 60)を使用して日付を抽出することができます' '#[1]」を与える2013-01-05 00:00:52 UTC" – bmrn

+0

素晴らしい!意味がありますが、コードを実行すると、as_date( "1900-01-01")+秒(41277.000601851854 * 24 * 60 * 60)の結果が得られます。[1] "1831-12-13 20:45:52 UTC " –

関連する問題