BETA

pythonで日付(タイムスタンプの文字列)から日付の特徴を作成する

投稿日:2019-09-10
最終更新:2019-09-10
※この記事は外部サイト(https://paper.hatenadiary.jp/entry/2019/07...)からのクロス投稿です

タイムスタンプの文字列から、日付に関する特徴(情報)を計算する。
Qrunchの利用テストも兼ねて。

必要ライブラリ

こちらから jpholiday をインストール、祝日の判定に使用する。
ありがたい。

Lalcs/jpholiday

from datetime import datetime, date, timedelta  
import calendar  
import jpholiday  
import numpy as np  

文字列からタイムスタンプを取得

文字列を %Y/%m/%d (年/月/日) としてパースする。年月日以外の各種ディレクティブ(記号)の意味はドキュメントを参照。

datetime --- 基本的な日付型および時間型 Python 3.7.4 ドキュメント

# 2019/6/30から年月日をパース  
timestamp_str = '2019/6/30'  
t = datetime.strptime(timestamp_str, '%Y/%m/%d')  

曜日

datetime --- 基本的な日付型および時間型 Python 3.7.4 ドキュメント

# 月:0 ~ 日:6 のint型で取得  
weekday = t.weekday()  

祝日フラグ

holidayflag = jpholiday.is_holiday(t.date())  

次の日が休日

beginofh = jpholiday.is_holiday(t.date()+ timedelta(days=1)) or (t.date() + timedelta(days=1)).weekday()>4  

次の日が平日

endofh = not(jpholiday.is_holiday(t.date()+ timedelta(days=1))) and (t.date() + timedelta(days=1)).weekday()==0  

元旦から何日目か

time --- 時刻データへのアクセスと変換 Python 3.7.4 ドキュメント

tm_ydayに年度始めからの日数が保存されている。tm_zoneなど他のものは上記ドキュメント参照。

dayofyear = t.timetuple().tm_yday  

年と週番号(元旦から第何週目か)

date.isocalendar()はISO 年、ISO 週番号、ISO 曜日を返す。

year, weekofyear, _ = t.isocalendar()  

月と日

month, day = t.month, t.day  

年度始めから何日目か

年度始めからの日数の差分を求める。

# X年4月1日からの経過日数  
frombiginofyear = (t.date() - datetime(t.year-(t.month<4)*1, 4, 1).date()).days  

その月の平日と休日の一覧

# 特定の年月の平日・休日一覧を取得  
def getdaytypelistfromYM(year, month):  
    weekdays, holydays = [], []  
    for i in range(calendar.monthrange(year, month)[1]):  
        if datetime(year, month, i+1).weekday()<5 and not jpholiday.is_holiday(date(year, month, i+1)):  
            # 平日の場合  
            weekdays += [i+1]  
        else:  
            # 休日・祝日  
            holydays += [i+1]  
    return weekdays, holydays  

weekdays, holydays = getdaytypelistfromYM(year, month)  

特定期間の間の休日でない日(営業日数)を数えるには、workdaysライブラリを使う手もある。

workdays

networkdays(date(2009, 12, 25),date(2009, 12, 27), [ date(year=2009,month=12
,day=25)] )
0

その月に平日と休日が何日あるか

上記「その月の平日と休日」のリストの長さ。

weekdays, holydays = getdaytypelistfromYM(year, month)  
numofweekdays, numofholydays = len(weekdays), len(holydays)  

一年前の今日に一番近い同じ曜日の日付

nearestwd = date(year-1, month, day)  
for i in range(4):  
    # 一年前 + i日後の曜日と比較  
    if weekday == (nearestwd + timedelta(days=i)).weekday():  
        nearestwd = date(year-1, month, day) + timedelta(days=i)  
        break  
    # 一年前 - i日後の曜日と比較  
    if weekday == (nearestwd + timedelta(days=-i)).weekday():  
        nearestwd = date(year-1, month, day) + timedelta(days=-i)  
        break  

特定の日付からの経過日数

# 2017/6/30 から何日経過したか  
daydiff = (t.date() - datetime(2017, 6, 30).date()).days  
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

コードがあるもののみ、記録する予定です.

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!