日付列(string)と時間列(int)を結合してdatetime型にするのにはまった

pythonで日付が文字列、時間がintで与えられたdataframeがあったとする。
この日付列と時間列からdatetime型の日時列を作ろうとしたら、フォーマット指定を厳密にやらなければいけないということに気が付かずはまった。
(いろいろなwebサイトを見ているうちに、pandas.to_datetime()関数は厳密なフォーマット指定をしなくてもいい感じにしてくれるという思考になってしまい、フォーマット指定が問題だということになかなか気が付かなかった。)

例えばこんな感じのdataframeがあったとする。

df =  pd.DataFrame({'date': ['2017-01-01','2017-01-02'], 'time': [0, 1]})
df.info()
#<class 'pandas.core.frame.DataFrame'>
#RangeIndex: 2 entries, 0 to 1
#Data columns (total 2 columns):
#date    2 non-null object
#time    2 non-null int64
#dtypes: int64(1), object(1)
#memory usage: 112.0+ bytes

このdate列とtime列を組み合わせてdatetime列を作るときには以下のようにやればよい。

df['datetime'] = pd.to_datetime(df['date'] + ' ' + df['time'].astype(str) + ':00', format='%Y-%m-%d %H:%M')
df['datetime']

いろいろと試してみたが以下はいずれもダメだったパターン。

# 'date'と'time'の結合後文字列は'YYYY-mm-dd HH:MM'というフォーマットだが、formatに指定しているフォーマットと異なるのでエラーとなる
df['datetime'] = pd.to_datetime(df['date'] + ' ' + df['time'].astype(str) + ':00', format='%Y%m%d%H%M')
# time data '2017-01-01 0:00' does not match format '%Y%m%d%H%M' (match)

# 'time'が1桁の場合(0〜9)があるからダメなんだと思ってzfillで0埋めしたが、これも勘違いだった。
df['datetime'] = pd.to_datetime(df['date'] + ' ' + df['time'].astype(str).str.zfill(2) + ':00', format='%Y%m%d%H%M')
# time data '2017-01-01 00:00' does not match format '%Y%m%d%H%M' (match)

# errors='ignore'オプションをつけてみたら一見すると上手くいくが、'datetime'列は文字列(object)型になってしまった
df['datetime'] = pd.to_datetime(df['date'] + ' ' + df['time'].astype(str) + ':00', format='%Y%m%d%H%M', errors='ignore')
df.info()
#<class 'pandas.core.frame.DataFrame'>
#RangeIndex: 2 entries, 0 to 1
#Data columns (total 3 columns):
#date        2 non-null object
#time        2 non-null int64
#datetime    2 non-null object
#dtypes: int64(1), object(2)
#memory usage: 128.0+ bytes

あと、datetime型であっても、上記例で2017-01-01 0:00という0時の行だけを表示したら、日付しか表示されなかったので少し焦った。
2017-01-01 1:00のように0時以外の行も同時に表示したら、0時の行もちゃんと時刻まで表示された。この辺はJupyterか環境のデフォルト設定のせいかもしれない。

datetime型への変換については、もっとスマートなやり方があったら知りたい。

今日はこんなところです。

JupyterLabのターミナルでテキストのコピペをする方法

環境

  • OS: Windows7
  • ブラウザ: Chrome71
  • jupyterlab: version 0.28.11

どうやるか

  • JupyterLabのターミナルはコピーやペーストのショートカットがきかない。
  • また、ターミナルにカーソルオーバーした状態で右クリックをするだけでは"Refresh Terminal"というJupyterLabの操作が表示されてしまう。
  • この問題を解決するためには、shiftキーを押下しながら右クリックをすればよい。
  • そうするとOSの操作メニューが表示され、コピー・ペーストが実行可能になる。