読者です 読者をやめる 読者になる 読者になる

pythonで日付を表す文字列から時間の差や時間の加算を求める

やりたいこと

2016-06-25 21:01:09.0002016/06/25 21-01-09 といった自由な形式の時間の差分を取りたい時。

コード

"%Y-%m-%d %H:%M:%S.000"の箇所を自由な形式に変換することで、どのようなデータにも対応できる。

import datetime as dt

# 時間
time1 = *2016-06-25 21:01:09.000*
time2 = *2016-06-26 22:21:11.000*

# datetimeに変換
new_time1 = dt.datetime.strptime(time1, "%Y-%m-%d %H:%M:%S.000") 
new_time2 = dt.datetime.strptime(time2, "%Y-%m-%d %H:%M:%S.000") 

# 計算が可能になる
new_time1 - new_time2

大概はこのようなデータはcsvで大量に存在しているのでpandasのDataFrameにデータを格納して

def convert_time(t):return dt.datetime.strptime(time1, "%Y-%m-%d %H:%M:%S.000") 

df.apply(lambda x: convert_time(x['time_column']), axis=1)

などとして一括変換してしまう。ちなみに pd.to_datetimeも存在する。その場合は

data['checkin_time'] = pd.to_datetime(data['boarding_time'], format="%m-%d-%Y")

となる。

時間の加算

time + dt.timedelta(hours=1)

記号の説明

ここより一部抜粋させていただきました。

記号 説明
%a ロケールにおける省略形の曜日名。
%A ロケールにおける省略なしの曜日名。
%b ロケールにおける省略形の月名。
%B ロケールにおける省略なしの月名。
%c ロケールにおける適切な日付および時刻表現。
%d 月の始めから何日目かを表す 10 進数 [01,31]。
%H (24 時間計での) 時を表す 10 進数 [00,23]。
%I (12 時間計での) 時を表す 10 進数 [01,12]。
%j 年の初めから何日目かを表す 10 進数 [001,366]。
%m 月を表す 10 進数 [01,12]。
%M 分を表す 10 進数 [00,59]。
%p ロケールにおける AM または PM に対応する文字列。
%S 秒を表す 10 進数 [00,61]。
%U 年の初めから何週目か (日曜を週の始まりとします)を表す 10 進数 [00,53]。年が明けてから最初の日曜日までの全ての 曜日は 0 週目に属すると見なされます。
%w 曜日を表す 10 進数 [0(日曜日),6]。
%W 年の初めから何週目か (日曜を週の始まりとします)を表す 10 進数 [00,53]。年が明けてから最初の月曜日までの全ての 曜日は 0 週目に属すると見なされます
%% 文字 "%" 自体の表現。