株価データはほぼ必ず日付と紐づきます。本記事では Python の標準ライブラリ datetime を使った、日付・期間・営業日まわりの基本処理を整理します。
目次
- 3 つの主要クラス
- 今日の日付を取る
- 文字列から日付を作る
- 日付を文字列にする
- 日付の差を取る — timedelta
- 月や年の加算は注意
- 営業日の扱い
- 期間内の営業日リストを作る
- タイムゾーン
- 株価データでよくある変換
3 つの主要クラス
datetime モジュールには、日付・時刻を表す 3 つの主要クラスがあります。
| クラス | 表すもの | 例 |
|---|---|---|
date | 日付(年月日) | 2026-04-01 |
time | 時刻(時分秒) | 09:00:00 |
datetime | 日付 + 時刻 | 2026-04-01 09:00:00 |
株価分析では date と datetime をよく使います。
今日の日付を取る
from datetime import date, datetime
print(date.today()) # 2026-05-11print(datetime.now()) # 2026-05-11 14:30:45.123456date.today() は時刻を含みません。日次の集計など「日付だけが欲しい」場面で使います。
文字列から日付を作る
CSV や JSON から読み込んだ日付は、最初は文字列です。strptime で日付型に変換します。
from datetime import datetime, date
s = "2026-04-01"d = datetime.strptime(s, "%Y-%m-%d").date()print(d) # 2026-04-01print(type(d)) # <class 'datetime.date'>ISO 8601 形式(YYYY-MM-DD)に限れば、date.fromisoformat のほうが簡潔です。
d = date.fromisoformat("2026-04-01")print(d) # 2026-04-01日付を文字列にする
逆方向は strftime または isoformat() です。
from datetime import date
d = date(2026, 4, 1)print(d.isoformat()) # 2026-04-01print(d.strftime("%Y/%m/%d")) # 2026/04/01print(d.strftime("%Y年%m月%d日")) # 2026年04月01日代表的な書式コードは次のとおりです。
| 書式 | 意味 | 例 |
|---|---|---|
%Y | 西暦 4 桁 | 2026 |
%m | 月(2 桁) | 04 |
%d | 日(2 桁) | 01 |
%H | 時(24 時間) | 09 |
%M | 分 | 30 |
%S | 秒 | 00 |
%a | 曜日(短縮) | Mon |
日付の差を取る — timedelta
日付同士の差は timedelta 型になります。
from datetime import date, timedelta
start = date(2026, 4, 1)end = date(2026, 4, 30)
diff = end - startprint(diff) # 29 days, 0:00:00print(diff.days) # 29逆に「30 日後」「1 週間前」を計算するには timedelta を足します。
today = date(2026, 5, 11)print(today + timedelta(days=30)) # 2026-06-10print(today - timedelta(weeks=1)) # 2026-05-04月や年の加算は注意
timedelta には「1 ヶ月」「1 年」という単位はありません。月をまたいだ計算は標準ライブラリだけだと面倒です。
from datetime import date
# 単純に「30 日後」は「1 ヶ月後」と同じではないprint(date(2026, 1, 31) + timedelta(days=30)) # 2026-03-02正確な月単位の計算が必要なら、サードパーティの dateutil を使います(#3-12「pip と requirements.txt とパッケージ管理」 で扱う pip でインストール)。
# pip install python-dateutilfrom dateutil.relativedelta import relativedelta
print(date(2026, 1, 31) + relativedelta(months=1)) # 2026-02-28営業日の扱い
株式市場は土日休みなので、営業日(weekday)の判定がよく必要になります。weekday() メソッドが曜日を返します。
| 戻り値 | 曜日 |
|---|---|
| 0 | 月曜 |
| 1 | 火曜 |
| … | … |
| 5 | 土曜 |
| 6 | 日曜 |
from datetime import date
def is_weekday(d: date) -> bool: return d.weekday() < 5
print(is_weekday(date(2026, 5, 11))) # True (月)print(is_weekday(date(2026, 5, 16))) # False (土)期間内の営業日リストを作る
「ある期間の営業日だけ取り出す」処理です。
from datetime import date, timedelta
def weekdays_between(start: date, end: date) -> list[date]: days = [] current = start while current <= end: if current.weekday() < 5: days.append(current) current += timedelta(days=1) return days
period = weekdays_between(date(2026, 5, 1), date(2026, 5, 10))for d in period: print(d, d.strftime("%a"))「日本の祝日も除外したい」場合は、jpholiday などのライブラリを使います。
タイムゾーン
datetime.now() は タイムゾーン情報を持たない 値を返します。複数のシステムを跨ぐときは、タイムゾーンを明示するのが安全です。
from datetime import datetime, timezone, timedelta
JST = timezone(timedelta(hours=9))
now_jst = datetime.now(JST)print(now_jst) # 2026-05-11 14:30:45.123456+09:00print(now_jst.isoformat()) # 2026-05-11T14:30:45.123456+09:00J-Quants API のように日本市場のデータを扱うかぎり、JST(UTC+9)で統一しておけば困る場面は少なくなります。
株価データでよくある変換
文字列で受け取った日付列を、date のリストにする処理です。
from datetime import date
raw_dates = ["2026-04-01", "2026-04-02", "2026-04-03"]parsed = [date.fromisoformat(s) for s in raw_dates]
for d in parsed: print(d, d.weekday())リスト内包表記で 1 行にまとめる書き方は#3-10「リスト内包表記と lambda」 で扱います。
生成AI へのプロンプト例
日付処理を生成AI に依頼する例です。
Python 3.12 標準ライブラリで、次の処理を書いてください。
引数: start (str, "YYYY-MM-DD"), days (int)処理: start から「営業日(月-金)で days 日後」の date を返す。 土日はスキップして数える(祝日は考慮しない)。戻り値: datetime.date- 関数名は: add_business_days- 引数の文字列が不正な形式なら ValueError を再 raise する- 簡単な使用例(doctest 形式) を関数の docstring に含める「祝日を考慮しない」など条件を明示すると、過不足のないコードが返ります(#7-2「データ分析のためのプロンプト設計」)。
まとめ
date/datetime/timedeltaの 3 つでほとんどの処理が書ける- 文字列との相互変換は
fromisoformat/isoformatがいちばん簡潔 - 月単位の計算は
dateutil.relativedeltaを使う - 営業日判定は
weekday() < 5、祝日が必要ならjpholiday