CSV などから日時の文字列を読み込み、そこから年や月、時間を取りだしたいとします。正規表現を使えばいいのですが、ちょっと面倒なので別の方法でやってみます。
大まかに方法をいうと、文字列を datetime 型に変換して、そこから属性 year や month を個別に取りだします。datetime に変換する手順として 2 パターンあります。フォーマットを指定する パターンと 指定しない パターンです。
- 目次 -
スポンサーリンク
フォーマットを指定する ⇒ strptime を使う
フォーマットを指定して変換する場合は strptime を使います。下記サンプルの
%Y-%m-%d %H:%M:%S
の部分がフォーマットです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
from datetime import datetime str = '2000-12-1 15:30:45' dt = datetime.strptime(str, '%Y-%m-%d %H:%M:%S') #-------------------------------------------- # datetime.datetime(2000, 12, 1, 15, 30, 45) #-------------------------------------------- print (dt.year) # => 2000 print (dt.month) # => 12 print (dt.day) # => 1 print (dt.hour) # => 15 print (dt.minute) # => 30 print (dt.second) # => 45 |
フォーマットに使える文字は こちら が参考になります。
パース例
クレジットカードの期限をパースする場合
1 2 3 4 5 6 7 |
dt = datetime.strptime('03/18', '%m/%y') #---------------------------------------- # datetime.datetime(2018, 3, 1, 0, 0) #---------------------------------------- print (dt.year) # => 2018 print (dt.month) # => 3 |
フォーマットを指定しない ⇒ parse にまかせる
dateutil.parser の parse を使えば、フォーマットを指定しなくても、うまくやってくれます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
from dateutil.parser import parse str = '2000-12-1 15:30:45' dt = parse(str) #-------------------------------------------- # datetime.datetime(2000, 12, 1, 15, 30, 45) #-------------------------------------------- print (dt.year) # => 2000 print (dt.month) # => 12 print (dt.day) # => 1 print (dt.hour) # => 15 print (dt.minute) # => 30 print (dt.second) # => 45 |
月が英語の場合
月の指定が Jan や Dec のように英語の略称の場合もパースしてくれます。
1 2 3 4 5 6 |
dt = parse('2000 Dec 1 15:30:45') #-------------------------------------------- # datetime.datetime(2000, 12, 1, 15, 30, 45) #-------------------------------------------- print (dt.month) # => 12 |
日が先にくる場合
月より日が先にくる場合、dayfirst=True を指定してやります。
1 2 3 4 5 6 7 8 |
dt = parse('1/12/2000', dayfirst=True) #---------------------------------------- # datetime.datetime(2000, 12, 1, 0, 0) #---------------------------------------- print (dt.year) # => 2000 print (dt.month) # => 12 print (dt.day) # => 1 |