R での日付の操作 (基本機能、lubridate および timeperiodsR パッケージ)

任意のプログラミング言語で現在の日付を取得します。これは、「Hello world!」と同等の操作です。 R 言語も例外ではありません。

この記事では、R 言語の基本構文で日付を操作する方法を説明し、日付を操作するときにその機能を拡張するいくつかの便利なパッケージについても説明します。

  • lubridate — 日付間の算術計算を実行できるパッケージ。
  • timeperiodsR — 時間間隔とそのコンポーネントを操作するためのパッケージ。

R での日付の操作 (基本機能、lubridate および timeperiodsR パッケージ)

ページ内容

データ分析、特に R 言語に興味がある場合は、私の記事に興味があるかもしれません。 電報 и ユーチューブ チャンネル。 コンテンツのほとんどは R 言語専用です。

  1. 基本的な R 構文での日付の操作
    1.1. テキストを日付に変換する
    1.2. 基本的な R での日付コンポーネントの抽出
  2. lubridate パッケージを使用した日付の操作
    2.1. lubridate を使用してテキストを日付に変換する
    2.2. lubridate パッケージを使用した日付コンポーネントの抽出
    2.3. 日付の算術演算
  3. 期間、timeperiodsR パッケージを使用した作業の簡素化
    3.1. timeperiodsR の時間間隔
    3.2. timeperiodsR を使用した日付のベクトルのフィルター処理
  4. まとめ

基本的な R 構文での日付の操作

テキストを日付に変換する

基本的な R には、日付を操作するための一連の関数があります。 基本構文の欠点は、関数名と引数の大文字と小文字が非常に分散しており、実質的に論理的なつながりがないことです。 ただし、言語の基本的な機能を知っておく必要があるので、そこから始めます。

ほとんどの場合、CSV ファイルまたはその他のソースから R にデータをロードするときに、日付をテキストとして受け取ります。 このテキストを正しいデータ型に変換するには、関数を使用します。 as.Date().

# создаём текстовый вектор с датами
my_dates <- c("2019-09-01", "2019-09-10", "2019-09-23")

# проверяем тип данных
class(my_dates)

#> [1] "character"

# преобразуем текст в дату
my_dates <- as.Date(my_dates)

# проверяем тип данных
class(my_dates)

#> [1] "Date"

Поумолчанию as.Date() は XNUMX つの形式の日付を受け入れます。 YYYY-MM-DD または YYYY/MM/DD.
データセットに他の形式の日付が含まれている場合は、引数を使用できます。 format.

as.Date("September 26, 2019", format = "%B %d, %Y")

形式でアーカイブしたプロジェクトを保存します. 任意の時間間隔とその形式を示す文字列形式の演算子を受け入れます。最も一般的に使用される値を以下の表に示します。

フォーマット
説明

%d
月の日番号

%a
曜日の名前の略称

%A
曜日の正式名称

%w
曜日の番号 (0 ~ 6、0 は日曜日)

%m
01桁の月指定(12~XNUMX)

%b
月名の略称(apr、mar、…)

%B
完全な月名

%y
XNUMX桁の年指定

%Y
XNUMX桁の年指定

%j
その年の日数 (001 ~ 366)

%U
その年の週の番号 (00 ~ 53)、週の始まりは日曜日

%W
年の週番号 (00 ~ 53)、週の始まり月曜日

したがって、「26 年 2019 月 XNUMX 日」は、月、日、年の正式名称です。 この日付形式は、次のように演算子を使用して記述できます。"%B %d, %Y".

ここで:

  • %B — 月の正式名称
  • %d — 月内の日の数
  • %Y — XNUMX 桁の年指定

日付形式を記述するときは、ダッシュ、カンマ、ピリオド、スペースなどの文字列の追加文字をすべて含めることが重要です。 私の例「26 年 2019 月 XNUMX 日」では、日付の後にカンマがあり、形式の説明にもカンマを入れる必要があります。"%B %d, %Y".

標準形式に対応していないだけでなく、日付を受け取る場合もあります。 (YYYY-MM-DD または YYYY/MM/DD)、ただし、オペレーティング システムにインストールされているデフォルトの言語とは異なる言語も使用されます。 たとえば、「15年2019月XNUMX日」というように日付が記載されたデータをダウンロードしたとします。 この文字列を日付に変換する前に、ロケールを変更する必要があります。

# Меняем локаль
Sys.setlocale("LC_TIME", "Russian")
# Конвертируем строку в дату
as.Date("Декабрь 15, 2019 г.", format = "%B %d, %Y")

基本的な R での日付コンポーネントの抽出

基本的な R には、クラス オブジェクトから日付の一部を抽出できる関数はあまりありません。 日付.

current_date <- Sys.Date() # текущая дата
weekdays(current_date)     # получить номер дня недели
months(current_date)       # получить номер месяца в году
quarters(current_date)     # получить номер квартала в году

メインのオブジェクトクラスに加えて 日付 基本的な R には、タイムスタンプを格納するデータ型がさらに 2 つあります。 POSIXlt, POSIXct。 これらのクラスとの主な違いは、 日付 それは日付に加えて時間を保存することです。

# получить текущую дату и время
current_time <- Sys.time()

# узнать класс объекта current_time 
class(current_time)

# "POSIXct" "POSIXt"

機能 Sys.time() 現在の日付と時刻を形式で返します POSIXct。 この形式は意味的には次のようなものです ユニックスタイム、UNIX時代の始まりからの秒数を格納します。 (31 年 1969 月 1 日から 1970 年 XNUMX 月 XNUMX 日までの深夜 (UTC)).

クラス POSIXlt また、時刻と日付、およびそのすべてのコンポーネントも保存されます。 したがって、より複雑な構造を持つオブジェクトですが、日付と時刻のコンポーネントを簡単に取得できます。 実際には POSIXlt それ リスト.

# Получаем текущую дату и время
current_time_ct <- Sys.time()

# Преобразуем в формат POSIXlt
current_time_lt <- as.POSIXlt(current_time_ct)

# извлекаем компоненты даты и времени
current_time_lt$sec   # секунды
current_time_lt$min   # минуты
current_time_lt$hour  # часы
current_time_lt$mday  # день месяца
current_time_lt$mon   # месяц
current_time_lt$year  # год
current_time_lt$wday  # день недели
current_time_lt$yday  # день года
current_time_lt$zone  # часовой пояс

数値データとテキストデータの形式への変換 POSIX* 機能によって実行される as.POSIXct() и as.POSIXlt()。 これらの関数には小さな引数のセットがあります。

  • x — 数値、文字列、またはクラス オブジェクト 日付、これは変換する必要があります。
  • tz — タイムゾーン、デフォルトは「GMT」。
  • format — x 引数に渡されるデータが表現される日付形式の説明。
  • Origin — 数値を POSIX に変換する場合にのみ使用されます。この引数には、日付オブジェクトと秒のカウント元となる時刻を渡す必要があります。 通常、UNIXTIME からの変換に使用されます。

日時情報が入っている場合 ユニックスタイム次に、それらを明確で判読可能な日付に変換するには、次の例を使用します。

# Конвертируем UNIXTIME в читаемую дату 
as.POSIXlt(1570084639,  origin = "1970-01-01")

オリジンでは、任意のタイムスタンプを指定できます。 たとえば、データに 15 年 2019 月 12 日午後 15 時 XNUMX 分以降の秒数として日付と時刻が含まれている場合、日付に変換するには次のように使用します。

# Конвертируем UNIXTIME в дату учитывая что начало отсчёта 15 сентября 2019 12:15
as.POSIXlt(1546123,  origin = "2019-09-15 12:15:00")

lubridate パッケージを使用した日付の操作

lubridate R 言語で日付を操作するためのおそらく最も人気のあるパッケージで、XNUMX つの追加クラスが提供されます。

  • 期間 — 期間、つまりXNUMX つのタイムスタンプ間の秒数。
  • 期間 - 期間を使用すると、人間が判読できる間隔 (日、月、週など) で日付間の計算を行うことができます。
  • 間隔 - 開始時点と終了時点を提供するオブジェクト。

R言語での追加パッケージのインストールは標準機能を使用して実行されます install.packages().

パッケージのインストール lubridate:

install.packages("lubridate")

lubridate を使用してテキストを日付に変換する

パッケージの特徴 lubridate テキストを日付に変換するプロセスが大幅に簡素化され、日付と時刻を使った算術演算も実行できるようになります。

関数は現在の日付または日時を取得するのに役立ちます today() и now().

today() # текущая дата
now()   # текущая дата и время

文字列を日付に変換するには lubridate 関数のファミリー全体があり、その名前は常に XNUMX 文字で構成され、日付コンポーネントの順序を示します。

  • y - 年
  • 月 - 月

lubridate を介してテキストを日付に変換する関数のリスト

  • ymd()
  • ydm()
  • mdy()
  • myd()
  • dmy()
  • dym()
  • yq()

文字列を日付に変換する例をいくつか示します。

ymd("2017 jan 21")
mdy("March 20th, 2019")
dmy("1st april of 2018")

ご覧の通り lubridate 日付の説明をテキストとして認識する方がはるかに効率的で、形式を記述するために追加の演算子を使用せずにテキストを日付に変換できます。

lubridate パッケージを使用した日付コンポーネントの抽出

も使用しています lubridate 日付から任意のコンポーネントを取得できます。

dt <- ymd("2017 jan 21")

year(dt)  # год
month(dt) # месяц
mday(dt)  # день в месяце
yday(dt)  # день в году
wday(dt)  # день недели

日付の算術演算

しかし、最も重要で基本的な機能は、 lubridate 日付を使用してさまざまな算術演算を実行する機能です。

日付の丸めは、次の XNUMX つの関数によって実行されます。

  • floor_date — 最も近い過去時制に丸める
  • ceiling_date — 近未来時制に丸める
  • round_date - 最も近い時間に丸める

これらの関数にはそれぞれ引数があります 単位これにより、丸め単位を指定できます: 秒、分、時、日、週、月、隔月、四半期、季節、半年、年

dt <- ymd("2017 jan 21")

round_date(dt, unit = "month")    # округлить до месяца
round_date(dt, unit = "3 month")  # округлить до 3 месяцев
round_date(dt, unit = "quarter")  # округлить до квартала
round_date(dt, unit = "season")   # округлить до сезона
round_date(dt, unit = "halfyear") # округлить до полугодия

それでは、現在の日付から 8 日後の日付を取得し、XNUMX つの日付の間でその他のさまざまな算術計算を行う方法を考えてみましょう。

today() + days(8)   # какая дата будет через 8 дней
today() - months(2) # какая дата была 2 месяца назад
today() + weeks(12) # какая дата будет через 12 недель
today() - years(2)  # какая дата была 2 года назад

期間、timeperiodsR パッケージを使用した作業を簡素化しました。

timeperiodsR — 2019 年 XNUMX 月に CRAN で公開された、日付を操作するための新しいパッケージです。

パッケージのインストール timeperiodsR:

install.packages("timeperiodsR")

主な目的は、特定の日付に対する特定の時間間隔を迅速に決定することです。 たとえば、その関数を使用すると、次のことが簡単に行えます。

  • R で過去の週、月、四半期、または年を取得します。
  • 過去 4 週間など、日付を基準にして指定された時間間隔の数を取得します。
  • 結果の時間間隔からその構成要素 (開始日と終了日、間隔に含まれる日数、間隔に含まれる一連の日付全体) を抽出するのは簡単です。

すべてのパッケージ関数の名前 timeperiodsR 直感的に操作でき、次の XNUMX つの部分で構成されます。 方向_間隔ここで、

  • 方向 ここでは、指定された日付 (last_n、previous、this、next、next_n) を基準にして移動する必要があります。
  • 一時的な 間隔 期間を計算するには: 日、週、月、四半期、年。

フル機能セット:

  • last_n_days()
  • last_n_weeks()
  • last_n_months()
  • last_n_quarters()
  • last_n_years()
  • previous_week()
  • previous_month()
  • previous_quarter()
  • previous_year()
  • this_week()
  • this_month()
  • this_quarter()
  • this_year()
  • next_week()
  • next_month()
  • next_quarter()
  • next_year()
  • next_n_days()
  • next_n_weeks()
  • next_n_months()
  • next_n_quarters()
  • next_n_years()
  • custom_period()

timeperiodsR の時間間隔

これらの関数は、過去 XNUMX 週間または XNUMX か月のデータに基づいてレポートを作成する必要がある場合に役立ちます。 先月を取得するには、同じ名前の関数を使用します previous_month():

prmonth <- previous_month()

その後、オブジェクトが得られます 前月 クラス tprから、次のコンポーネントを簡単に入手できます。

  • 期間の開始日。この例では最後の月です。
  • 期間終了日
  • 期間に含まれる日数
  • 期間に含まれる日付の順序

さらに、各コンポーネントはさまざまな方法で入手できます。

# первый день периода
prmonth$start
start(prmonth)

# последний день периода
prmonth$end
end(prmonth)

# последовательность дат
prmonth$sequence
seq(prmonth)

# количество дней входящих в период
prmonth$length
length(prmonth)

引数を使用して任意のコンポーネントを取得することもできます 、これは各パッケージ関数に存在します。 可能な値: 開始、終了、シーケンス、長さ。

previous_month(part = "start")    # начало периода
previous_month(part = "end")      # конец периода
previous_month(part = "sequence") # последовательность дат
previous_month(part = "length")   # количество дней в периоде

それでは、パッケージ関数で使用できるすべての引数を見てみましょう timeperiodsR:

  • x — 期間が計算される基準日。デフォルトでは現在の日付。
  • n — 期間に含まれる間隔の数(たとえば、過去 3 週間)。
  • part — オブジェクトのどのコンポーネントか tpr デフォルトで取得する必要があります all;
  • week_start — この引数は週を扱う関数にのみ存在し、週の始まりとみなされる曜日の番号を設定できます。デフォルトでは、週の始まりは月曜日ですが、次のいずれかを設定できます。 1 - 月曜日から 7 - 日曜日まで。

したがって、現在または他の任意の日付を基準にして任意の期間を計算できます。さらにいくつかの例を次に示します。

# получить 3 прошлые недели
# от 6 октября 2019 года
# начало недели - понедельник
last_n_weeks(x = "2019-10-06", 
             n = 3, 
             week_start = 1)

 Time period: from  9 September of 2019, Monday to 29 September of 2019, Sunday

6月XNUMX日は日曜日です:
R での日付の操作 (基本機能、lubridate および timeperiodsR パッケージ)

6 月 3 日を基準として、それまでの 6 週間かかる期間が必要です。 9 月 29 日自体を含む週は含まれません。 したがって、XNUMX月XNUMX日からXNUMX月XNUMX日までの期間となります。

R での日付の操作 (基本機能、lubridate および timeperiodsR パッケージ)

# получить месяц отстающий на 4 месяца
# от 16 сентября 2019 года
previous_month(x = "2019-09-16", n = 4)

 Time period: from  1 May of 2019, Wednesday to 31 May of 2019, Friday

この例では、4 か月前の月に関心があります。16 年 2019 月 2019 日から開始すると、XNUMX 年 XNUMX 月になります。

timeperiodsR を使用した日付のベクトルのフィルター処理

日付をフィルタリングするには timeperiodsR いくつかの演算子があります。

  • %left_out% - XNUMX つの tpr クラス オブジェクトを比較し、右側のオブジェクトに欠落している左側のオブジェクトの値を返します。
  • %left_in% - tpr クラスの XNUMX つのオブジェクトを比較し、右側のオブジェクトに含まれる左側のオブジェクトの日付を返します。
  • %right_out% - XNUMX つの tpr クラス オブジェクトを比較し、左側のオブジェクトに欠けている右側のオブジェクトの値を返します。
  • %right_in% - tpr クラスの XNUMX つのオブジェクトを比較し、左側のオブジェクトに存在する右側のオブジェクトの日付を返します。

period1 <- this_month("2019-11-07")
period2 <- previous_week("2019-11-07")

period1 %left_in% period2   # получить даты из period1 которые входят в period2
period1 %left_out% period2  # получить даты из period1 которые не входят в period2
period1 %right_in% period2  # получить даты из period2 которые входят в period1
period1 %right_out% period2 # получить даты из period2 которые не входят в period1

パッケージに timeperiodsR 公式のロシア語版があります YouTube プレイリスト.

まとめ

日付を扱うために R 言語で設計されたオブジェクトのクラスを詳細に調べました。 また、パッケージを使用して日付の算術演算を実行し、任意の期間をすばやく取得できるようになりました。 timeperiodsR.

R 言語に興味がある場合は、私の電報チャンネルに登録することをお勧めします。 R4マーケティングでは、日常の問題を解決する際の R 言語の使用について役立つ資料を毎日共有します。

出所: habr.com

コメントを追加します