

pandasによるデータフレームで0~23のhour列と、0~60のminute列があり、その2列からtime列("%H:%M"の形式)を作りたいと考えています。  
ですが、hour、minuteともにint型だからかエラーが出てうまくいきません。  
どのように対処すればよろしいでしょうか？


CC BY-SA 4.0
2019-12-14T15:47:06.597
61443
2020-01-10T12:26:22.147
12457
question
python python3 pandas
時間を望んだformatで表示させる方法

[code]

    In [2]: df = pd.DataFrame([[1, 15], [2, 30], [3, 0]], columns=['hour', 'minute'])
          : df
    Out[2]:
       hour  minute
    0     1      15
    1     2      30
    2     3       0
    
[/code]

上記のようなデータフレームが与えられたとして、 dataframe 自身のの文字列操作だけでやるとすると、

[code]

    In [3]: df[['hour', 'minute']].astype(str).apply(lambda s: s.str.zfill(2)).apply(
          :     lambda s: s.str.cat(sep=':'),
          :     axis=1
          : )
    Out[3]:
    0    01:15
    1    02:30
    2    03:00
    dtype: object
    
[/code]

になるかなと思いました。


CC BY-SA 4.0
2020-01-10T07:40:59.703
62128
2020-01-10T07:40:59.703
754
61443
answer


> hour、minuteともにint型だからかエラーが出てうまくいきません。

だったら文字列型に変換するとよいのでは

[code]

    import pandas as pd
    
    df = pd.DataFrame({'hour':[1,2,3], 'minute':[10,20,30]})
    
    r = df.hour.astype(str) + ":" + df.minute.astype(str)
    #0    1:10
    #1    2:20
    #2    3:30
    #dtype: object
    
[/code]

apply 使うとこんな感じ

[code]

    r = df[['hour','minute']].astype(str).apply(':'.join ,axis=1)
    #0    1:10
    #1    2:20
    #2    3:30
    #dtype: object
    
[/code]

２つ目の方法であれば文字列型でなくともできる

[code]

    r = df.apply(lambda d:f"{d.hour}:{d.minute:02d}", axis=1)
    #0    1:10
    #1    2:20
    #2    3:30
    #dtype: object
    
[/code]

これが一番シンプルかな


CC BY-SA 4.0
2020-01-10T12:26:22.147
62136
2020-01-10T12:26:22.147
24801
61443
answer