web-dev-qa-db-ja.com

Rで日付を年-月にフォーマットする

現在の日付の列を日付として年月の形式で保持したいと思います。現在、chr形式に変換されます。私はas_datetimeを試しましたが、すべての値をNAに強制します。私が探しているフォーマットは「2017-01」です。

library(lubridate)
df<- data.frame(Date=c("2017-01-01","2017-01-02","2017-01-03","2017-01-04",
                       "2018-01-01","2018-01-02","2018-02-01","2018-03-02"),
            N=c(24,10,13,12,10,10,33,45))
df$Date <- as_datetime(df$Date)
df$Date <- ymd(df$Date)
df$Date <- strftime(df$Date,format="%Y-%m")

前もって感謝します!

7
AM_123

lubridateは日付のみを処理し、日付には日があります。ただし、アリステアが言及しているように、月ごとに必要な月ごとにフロアをフロアすることができます。

_library(tidyverse)

df_month <-
  df %>%
  mutate(Date = floor_date(as_date(Date), "month"))
_

あなたが例えば月ごとに集計したい場合は、group_by()summarize()だけです。

_df_month %>%
  group_by(Date) %>%
  summarize(N = sum(N)) %>%
  ungroup()

#> # A tibble: 4 x 2
#>  Date           N
#>  <date>     <dbl>
#>1 2017-01-01    59
#>2 2018-01-01    20
#>3 2018-02-01    33
#>4 2018-03-01    45
_

Zoo :: as.yearmon()関数でこれを解決できます。ソリューションに従います:

library(tidyquant)
library(magrittr) 
library(dplyr)

df <- data.frame(Date=c("2017-01-01","2017-01-02","2017-01-03","2017-01-04",
                  "2018-01-01","2018-01-02","2018-02-01","2018-03-02"),
           N=c(24,10,13,12,10,10,33,45))
df %<>% mutate(Date = Zoo::as.yearmon(Date))

cut関数を使用して、breaks="month"は、日付のすべての日を月の最初の日に変換します。したがって、同じ月内のすべての日付は、新しく作成された列で同じ日付になります。

これは、データフレーム内の他のすべての変数を月ごとにグループ化するのに役立ちます(基本的に、実行しようとしていること)。ただし、cutは因子を作成しますが、これは日付に変換できます。そのため、データフレームに日付クラスを含めることができます。

日付からその日を取り除くことはできません(そのため、日付ではありません...)。その後、軸またはテーブルのニース形式を作成できます。例えば:

true_date <-
  as.POSIXlt(
    c(
      "2017-01-01",
      "2017-01-02",
      "2017-01-03",
      "2017-01-04",
      "2018-01-01",
      "2018-01-02",
      "2018-02-01",
      "2018-03-02"
    ),
    format = "%F"
  )

df <-
  data.frame(
    Date = cut(true_date, breaks = "month"),
    N = c(24, 10, 13, 12, 10, 10, 33, 45)
  )

## here df$Date is a 'factor'. You could use substr to create a formated column
df$formated_date <- substr(df$Date, start = 1, stop = 7)

## and you can convert back to date class. format = "%F", is ISO 8601 standard date format

df$true_date <- strptime(x = as.character(df$Date), format = "%F")

str(df)
2