株価データはほぼ必ず日付と紐づきます。本記事では Python の標準ライブラリ datetime を使った、日付・期間・営業日まわりの基本処理を整理します。

目次

  1. 3 つの主要クラス
  2. 今日の日付を取る
  3. 文字列から日付を作る
  4. 日付を文字列にする
  5. 日付の差を取る — timedelta
  6. 月や年の加算は注意
  7. 営業日の扱い
  8. 期間内の営業日リストを作る
  9. タイムゾーン
  10. 株価データでよくある変換

3 つの主要クラス

datetime モジュールには、日付・時刻を表す 3 つの主要クラスがあります。

クラス表すもの
date日付(年月日)2026-04-01
time時刻(時分秒)09:00:00
datetime日付 + 時刻2026-04-01 09:00:00

株価分析では datedatetime をよく使います。

今日の日付を取る

from datetime import date, datetime
print(date.today()) # 2026-05-11
print(datetime.now()) # 2026-05-11 14:30:45.123456

date.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-01
print(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-01
print(d.strftime("%Y/%m/%d")) # 2026/04/01
print(d.strftime("%Y年%m月%d日")) # 2026年04月01日

代表的な書式コードは次のとおりです。

書式意味
%Y西暦 4 桁2026
%m月(2 桁)04
%d日(2 桁)01
%H時(24 時間)09
%M30
%S00
%a曜日(短縮)Mon

日付の差を取る — timedelta

日付同士の差は timedelta 型になります。

from datetime import date, timedelta
start = date(2026, 4, 1)
end = date(2026, 4, 30)
diff = end - start
print(diff) # 29 days, 0:00:00
print(diff.days) # 29

逆に「30 日後」「1 週間前」を計算するには timedelta を足します。

today = date(2026, 5, 11)
print(today + timedelta(days=30)) # 2026-06-10
print(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-dateutil
from 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:00
print(now_jst.isoformat()) # 2026-05-11T14:30:45.123456+09:00

J-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