Pandas pd.date_range() 関数
pd.date_range()Pandasライブラリにおいて使用される日付範囲を生成する関数です。連続した日付を含む DatetimeIndex を作成でき、時系列データの作成、インデックス付け、整列によく使用されます。
時系列分析では、毎日、毎月、毎年など、固定頻度の日付シーケンスを生成する必要がよくあります。pd.date_range() は、さまざまな頻度のニーズを満たすための柔軟なパラメータを提供します。
単語の意味: date_range「日付範囲」という意味で、つまり一連の連続した日付の集合を生成することです。
基本構文とパラメータ
pd.date_range()Pandasライブラリのトップレベル関数であり、指定された頻度の日時インデックスを生成するために使用されます。
構文形式
pd.date_range(start=None, end=None, periods=None, freq=None, tz=None, normalize=False, name=None, closed=None)
パラメータの説明
| パラメータ | 型 | 必須かどうか | 説明 | デフォルト値 |
|---|---|---|---|---|
| start | 文字列または datetime | 任意 | 開始日。 | None |
| end | 文字列または datetime | 任意 | 終了日。 | None |
| periods | 整数 | 任意 | 生成する日付の数。start/end と合わせて3つのうち2つを指定します。 | None |
| freq | 文字列または DateOffset | 任意 | 頻度:'D'(日)、'H'(時)、'M'(月末)、'MS'(月初)、'Y'(年末)、'W'(週)など。 | 'D' |
| tz | 文字列 | 任意 | タイムゾーン名。例:'UTC'、'Asia/Shanghai'。 | None |
| normalize | ブール値 | 任意 | True の場合、時間を午前0時に正規化します。 | False |
| name | 文字列 | 任意 | 生成される DatetimeIndex の名前。 | None |
| closed | 文字列 | 任意 | 区間の開閉:'left'、'right'、None(デフォルトは両端とも含む)。 | None |
戻り値の説明
- 戻り値:DatetimeIndex オブジェクトを返します。連続した日時が含まれます。
- 効果:指定された開始日、終了日、頻度に基づいて日付シーケンスを生成します。
例
簡単なものから複雑なものまでの一連の例を通して、pd.date_range()その使い方を完全にマスターしましょう。
例1:基本の使い方 - 日付範囲の生成
例
import pandas as pd
# 1. start と end パラメータを使用して日付範囲を生成する(デフォルトの頻度は日)
print("=== 2023-01-01 から 2023-01-10 まで ===")
dates = pd.date_range(start='2023-01-01', end='2023-01-10')
print(dates)
print(f"型: {type(dates)}")
print(f"データ型: {dates.dtype}")
# 2. periods パラメータを使用して生成数を指定する
print("n=== 7日間の日付を生成 ===")
week_dates = pd.date_range(start='2023-01-01', periods=7)
print(week_dates)
# 3. freq パラメータを使用して頻度を指定する
print("n=== 毎週1つの日付 (freq='W') ===")
weekly_dates = pd.date_range(start='2023-01-01', periods=5, freq='W')
print(weekly_dates)
# 4. 毎月初の日付 (freq='MS' = Month Start)
print("n=== 毎月初 (freq='MS') ===")
monthly_dates = pd.date_range(start='2023-01-01', periods=6, freq='MS')
print(monthly_dates)
# 5. 毎年末の日付 (freq='YE' = Year End)
print("n=== 毎年末 (freq='YE') ===")
yearly_dates = pd.date_range(start='2023-01-01', periods=3, freq='YE')
print(yearly_dates)
# 1. start と end パラメータを使用して日付範囲を生成する(デフォルトの頻度は日)
print("=== 2023-01-01 から 2023-01-10 まで ===")
dates = pd.date_range(start='2023-01-01', end='2023-01-10')
print(dates)
print(f"型: {type(dates)}")
print(f"データ型: {dates.dtype}")
# 2. periods パラメータを使用して生成数を指定する
print("n=== 7日間の日付を生成 ===")
week_dates = pd.date_range(start='2023-01-01', periods=7)
print(week_dates)
# 3. freq パラメータを使用して頻度を指定する
print("n=== 毎週1つの日付 (freq='W') ===")
weekly_dates = pd.date_range(start='2023-01-01', periods=5, freq='W')
print(weekly_dates)
# 4. 毎月初の日付 (freq='MS' = Month Start)
print("n=== 毎月初 (freq='MS') ===")
monthly_dates = pd.date_range(start='2023-01-01', periods=6, freq='MS')
print(monthly_dates)
# 5. 毎年末の日付 (freq='YE' = Year End)
print("n=== 毎年末 (freq='YE') ===")
yearly_dates = pd.date_range(start='2023-01-01', periods=3, freq='YE')
print(yearly_dates)
実行結果:
=== 从 2023-01-01 到 2023-01-10 ===
DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05',
'2023-01-06', '2023-01-07', '2023-01-08', '2023-01-09', '2023-01-10'],
dtype='datetime64[ns]', freq='D')
タイプ: <class 'pandas.core.indexes.datetimes.DatetimeIndex'>
数据类型: datetime64[ns]
=== 生成 7 天的日期 ===
DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05',
'2023-01-06', '2023-01-07'], dtype='datetime64[ns]', freq='D')
=== 每周一个日期 (freq='W') ===
DatetimeIndex(['2023-01-01', '2023-01-08', '2023-01-15', '2023-01-22', '2023-01-29'], dtype='datetime64[ns]', freq='W-SUN')
=== 每月初 (freq='MS') ===
DatetimeIndex(['2023-01-01', '2023-02-01', '2023-03-01', '2023-04-01', '2023-05-01',
'2023-06-01'], dtype='datetime64[ns]', freq='MS')
=== 每年末 (freq='YE') ===
DatetimeIndex(['2023-12-31', '2024-12-31', '2025-12-31'], dtype='datetime64[ns]', freq='YE-DEC')
コード解説:
pd.date_range()デフォルトでは、毎日の頻度で日付シーケンスが生成されます。freqパラメータは複数の頻度の略称をサポートしています:'D'(日)、'W'(週)、'M'(月末)、'MS'(月初)、'Y'(年末)、'H'(時)など。- 返されるのは DatetimeIndex オブジェクトで、Series や DataFrame のインデックスとして直接使用できます。
例2:時系列データの生成
日付インデックスを持つ DataFrame を作成し、時系列分析に使用します。
例
import pandas as pd
import numpy as np
# 1. 日付インデックス付きの DataFrame を作成する
print("=== シンプルな時系列を作成 ===")
# 30日分の日付を生成する
date_index = pd.date_range(start='2023-01-01', periods=30, freq='D')
# DataFrame を作成する
df = pd.DataFrame({
'date': date_index,
'value': np.random.randint(10, 100, size=30), # ランダムな値
'category': ['A', 'B'] * 15 # カテゴリを交互に設定
})
print(df.head(10))
# 2. 日付をインデックスに設定する
print("n=== 日付をインデックスに設定 ===")
df_indexed = df.set_index('date')
print(df_indexed.head())
# 3. 1時間ごとのデータを生成する(ログ分析用)
print("n=== 1時間ごとの時系列 ===")
hourly_index = pd.date_range(start='2023-01-01 08:00', periods=24, freq='H')
hourly_data = pd.DataFrame({
'timestamp': hourly_index,
'visitors': np.random.randint(0, 100, size=24)
})
print(hourly_data)
import numpy as np
# 1. 日付インデックス付きの DataFrame を作成する
print("=== シンプルな時系列を作成 ===")
# 30日分の日付を生成する
date_index = pd.date_range(start='2023-01-01', periods=30, freq='D')
# DataFrame を作成する
df = pd.DataFrame({
'date': date_index,
'value': np.random.randint(10, 100, size=30), # ランダムな値
'category': ['A', 'B'] * 15 # カテゴリを交互に設定
})
print(df.head(10))
# 2. 日付をインデックスに設定する
print("n=== 日付をインデックスに設定 ===")
df_indexed = df.set_index('date')
print(df_indexed.head())
# 3. 1時間ごとのデータを生成する(ログ分析用)
print("n=== 1時間ごとの時系列 ===")
hourly_index = pd.date_range(start='2023-01-01 08:00', periods=24, freq='H')
hourly_data = pd.DataFrame({
'timestamp': hourly_index,
'visitors': np.random.randint(0, 100, size=24)
})
print(hourly_data)
実行結果:
=== 创建一个简单的时间序列 ===
date value category
0 2023-01-01 67 A
1 2023-01-02 23 B
2 2023-01-03 45 A
3 2023-01-04 89 B
4 2023-01-05 12 A
5 2023-01-06 34 B
6 2023-01-07 56 A
7 2023-01-08 78 B
8 2023-01-09 91 A
9 2023-01-10 55 B
=== 设置日期为索引 ===
value category
date
2023-01-01 67 A
2023-01-02 23 B
2023-01-03 45 A
2023-01-04 89 B
2023-01-05 12 A
2023-01-06 34 B
=== 每小时的时间序列 ===
timestamp visitors
0 2023-01-01 08:00:00 25
1 2023-01-01 09:00:00 41
2 2023-01-01 10:00:00 77
3 2023-01-01 11:00:00 12
4 2023-01-01 12:00:00 58
5 2023-01-01 13:00:00 33
6 2023-01-01 14:00:00 45
7 2023-01-01 15:00:00 67
8 2023-01-01 16:00:00 29
9 2023-01-01 17:00:00 51
10 2023-01-01 18:00:00 44
11 2023-01-01 19:00:00 36
12 2023-01-01 20:00:00 28
13 2023-01-01 21:00:00 62
14 2023-01-01 22:00:00 19
15 2023-01-01 23:00:00 73
16 2023-01-02 00:00:00 41
17 2023-01-02 01:00:00 55
18 2023-01-02 02:00:00 38
19 2023-01-02 03:00:00 27
20 2023-01-02 04:00:00 49
21 2023-01-02 05:00:00 63
22 2023-01-02 06:00:00 34
23 2023-01-02 07:00:00 56
コード解説:
- DatetimeIndex は DataFrame のインデックスとして直接使用できます。
- 日付インデックスの DataFrame は、リサンプリング、ローリング計算などの豊富な時系列操作をサポートしています。
freq='H'時間単位のデータを生成でき、ログ分析などのシナリオに適しています。
例3:タイムゾーンと closed パラメータ
例
import pandas as pd
# 1. tz パラメータを使用してタイムゾーンを指定する
print("=== タイムゾーン付きの日付範囲 ===")
dates_tz = pd.date_range(start='2023-01-01', periods=3, freq='D', tz='Asia/Shanghai')
print(dates_tz)
print(f"タイムゾーン: {dates_tz.tz}")
# 2. UTC タイムゾーンを使用する
print("n=== UTC タイムゾーン ===")
dates_utc = pd.date_range(start='2023-01-01', periods=3, freq='D', tz='UTC')
print(dates_utc)
# 3. closed パラメータを使用して区間の開閉を制御する
print("n=== closed パラメータの比較 ===")
print("closed=None(デフォルト、両端とも含む):", pd.date_range('2023-01-01', '2023-01-03', freq='D', closed=None))
print("closed='left':", pd.date_range('2023-01-01', '2023-01-03', freq='D', closed='left'))
print("closed='right':", pd.date_range('2023-01-01', '2023-01-03', freq='D', closed='right'))
# 4. normalize パラメータを使用して時間を正規化する
print("n=== normalize パラメータ ===")
dates_with_time = pd.date_range(start='2023-01-01 14:30:00', periods=3, freq='H')
print("正規化前:", dates_with_time)
dates_normalized = pd.date_range(start='2023-01-01 14:30:00', periods=3, freq='H', normalize=True)
print("正規化後:", dates_normalized)
# 1. tz パラメータを使用してタイムゾーンを指定する
print("=== タイムゾーン付きの日付範囲 ===")
dates_tz = pd.date_range(start='2023-01-01', periods=3, freq='D', tz='Asia/Shanghai')
print(dates_tz)
print(f"タイムゾーン: {dates_tz.tz}")
# 2. UTC タイムゾーンを使用する
print("n=== UTC タイムゾーン ===")
dates_utc = pd.date_range(start='2023-01-01', periods=3, freq='D', tz='UTC')
print(dates_utc)
# 3. closed パラメータを使用して区間の開閉を制御する
print("n=== closed パラメータの比較 ===")
print("closed=None(デフォルト、両端とも含む):", pd.date_range('2023-01-01', '2023-01-03', freq='D', closed=None))
print("closed='left':", pd.date_range('2023-01-01', '2023-01-03', freq='D', closed='left'))
print("closed='right':", pd.date_range('2023-01-01', '2023-01-03', freq='D', closed='right'))
# 4. normalize パラメータを使用して時間を正規化する
print("n=== normalize パラメータ ===")
dates_with_time = pd.date_range(start='2023-01-01 14:30:00', periods=3, freq='H')
print("正規化前:", dates_with_time)
dates_normalized = pd.date_range(start='2023-01-01 14:30:00', periods=3, freq='H', normalize=True)
print("正規化後:", dates_normalized)
実行結果:
=== 带时区的日期范围 === DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03'], dtype='datetime64[ns, Asia/Shanghai]') 时区: Asia/Shanghai === UTC 时区 === DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03'], dtype='datetime64[ns, UTC]') === closed 参数对比 === closed=None (默认, 两端都闭): DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03']) closed='left': DatetimeIndex(['2023-01-01', '2023-01-02']) closed='right': DatetimeIndex(['2023-01-02', '2023-01-03']) === normalize 参数 === 归一化前: DatetimeIndex(['2023-01-01 14:30:00', '2023-01-01 15:30:00', '2023-01-01 16:30:00']) 归一化后: DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03'])
コード解説:
tzパラメータでタイムゾーンを指定でき、タイムゾーンをまたぐデータを処理する際に非常に便利です。closedパラメータで日付区間の開閉を制御でき、デフォルトは両端とも含みます。normalize=True時間を午前0時に正規化し、日付ごとにデータを集計しやすくします。
注意事項
重要な注意:
- 必ず指定する必要があります
startとend、または指定するかstartとperiods、または指定するかendとperiods、ただし、同時に1つだけを指定することはできません。- 頻度の略称は大文字と小文字を区別します。たとえば、'D' は日を表しますが、'd' はエラーになります。
- タイムゾーンデータを扱う場合は、すべての日付で統一されたタイムゾーンを使用するようにしてください。そうしないと、予期しない結果が生じる可能性があります。
- 大量の日付(数年分のデータなど)を生成する場合は、メモリ使用量に注意してください。
その他の拡張
Pandas よく使われる関数