DatetimeIndexがわからんので逆引きでまとめとくの巻
- 1. はじめに
- 2. 事例に使うデータとpandasとPython
- 3. 事例
- 3.1. DataFrameの構成の確認, index, columns, values, name
- 3.2. 指定した行番号のindex名を表示, index
- 3.3. 指定した列番号のcolumn名を表示, columns
- 3.4. 「年」を取り出す, year
- 3.5. 「月」を取り出す, month
- 3.6. 「日」を取り出す, day
- 3.7. 「年月日」を取り出す, date
- 3.8. 今年の何週目なのかを取り出す, week
- 3.9. 「曜日」を取り出す, weekday
- 3.10. 「曜日」を文字列で取り出す, day_name()
- 3.11. 「時」を取り出す, hour
- 3.12. 「分」を取り出す, minute
- 3.13. 「秒」を取り出す, second
- 3.14. 「時, 分, 秒」を取り出す, time
- 3.15. datetime.time型などで時間や日時(datetime)を指定して行を取り出す, loc
- 3.16. 文字列で時間や日時を指定して行を取り出す, loc
- 3.17. indexとcolumnを指定してvalueを取り出す
- 3.18. タイムゾーン の確認と設定, tzinfo(), tz_localize(), tz_convert()
- 3.19. pythonのdatetime.datetimeオブジェクトをpandasのdatetime(Timestamp)に変換, to_datetime()
はじめに
pandasでDatetimeIndexにした途端にわけがわからなくなり、
毎度毎度調べては情報の海で溺れがちなのでここにメモっておくことにしました。
目次から選択して該当事項へ飛ぶのです。
詳細はpandas公式サイト等で確認するとして。
事例に使うデータとpandasとPython
次のDataFrameをdfという変数に格納して使用することにします。
indexのデータ型がDatetimeIndexであることを確認しておきます。
print(df.index) DatetimeIndex(['2020-01-02 03:04:05', '2021-06-07 08:09:10','2022-11-12 13:14:15'], dtype='datetime64[ns]', name='YMDHMS', freq=None)
pandas; 0.24.2、Python; 3.7.2 です。
*「曜日」を文字列で取り出す, day_name() の項だけはpandas1.0.5で実施したものです(2020.6.26追記)
import pandas as pd import datetime
しときます。
事例
DataFrameの構成の確認, index, columns, values, name
print(df.index) #indexを確認 DatetimeIndex(['2020-01-02 03:04:05', '2021-06-07 08:09:10', '2022-11-12 13:14:15'], dtype='datetime64[ns]', name='YMDHMS', freq=None)
print(df.columns) #columnsを確認 Index(['a', 'b', 'c'], dtype='object')df.values
print(df.index.name) #indexのnameを確認 'YMDHMS'
print(df.values) #valuesを確認 array([['a0', 'b0', 'c0'], ['a1', 'b1', 'c1'], ['a2', 'b2', 'c2']], dtype=object)
print(df.columns.name) # columnsのnameを確認 None
指定した行番号のindex名を表示, index
print(df.index[0]) #1行目 Timestamp('2020-01-02 03:04:05')
print(df.index[1]) #2行目 Timestamp('2021-06-07 08:09:10')
print(df.index[0:2]) #1-2行目 DatetimeIndex(['2020-01-02 03:04:05', '2021-06-07 08:09:10'], dtype='datetime64[ns]', name='YMDHMS', freq=None)
指定した列番号のcolumn名を表示, columns
print(df.columns[0]) #1列目 'a'
print(df.columns[1]) #2列目 'b'
print(df.columns[0:2]) #1-2列目 Index(['a', 'b'], dtype='object')
「年」を取り出す, year
print(df.index.year) #DatetimeIndexに含まれる年 Int64Index([2020, 2021, 2022], dtype='int64', name='YMDHMS')
print(df.index[0].year) #1行目の年 2020
「月」を取り出す, month
print(df.index.month) #DatetimeIndexの月 Int64Index([1, 6, 11], dtype='int64', name='YMDHMS')
print(df.index[0].month) #1行目の月 1
「日」を取り出す, day
print(df.index.day) #DatetimeIndexの日 Int64Index([2, 7, 12], dtype='int64', name='YMDHMS')
print(df.index[0].day) #1行目の日 2
「年月日」を取り出す, date
print(df.index.date) #DatetimeIndexの年月日 array([datetime.date(2020, 1, 2), datetime.date(2021, 6, 7), datetime.date(2022, 11, 12)], dtype=object)
display(df.index[0].date) #1行目の年月日。うまく取り出せない。。。 <built-in method date of Timestamp object at 0x115d0fa48> display(df.index.date[0]) #DatatimeIndexの年月日を取り出した時の1個目。これは取り出せるのね。 datetime.date(2020, 1, 2)
今年の何週目なのかを取り出す, week
print(df.index.week) #DatetimeIndexの日付が今年の何週目か Int64Index([1, 23, 45], dtype='int64', name='YMDHMS')
display(df.index[0].week) #1行目の日付が今年の何週目か 1
「曜日」を取り出す, weekday
月曜日;0, 火曜日;1, 水曜日;2, 木曜日;3, 金曜日;4, 土曜日;5, 日曜日;6
print(df.index.weekday) #DatetimeIndexに含まれる曜日(木、月、土になります。) Int64Index([3, 0, 5], dtype='int64', name='YMDHMS')
print(df.index[0].weekday) #1行目の曜日。うまく取り出せない。。。 <built-in method weekday of Timestamp object at 0x115d0fa48>
print(df.index.weekday[0]) #含まれる曜日の1番目。3は木曜日 3
「曜日」を文字列で取り出す, day_name()
ここの項目だけpandas1.0.5で実施したもの(2020.06.26追記)
「曜日」を文字列の形で取り出す「weekday_name」はpandas1.0.0以降で廃止となったので1.0.0以上の場合は「day_name()」を使います。
print(df.index.day_name()) Index(['Thursday', 'Monday', 'Saturday'], dtype='object', name='YMDHMS')
print(df.index[0].day_name()) Thursday
「時」を取り出す, hour
print(df.index.hour) #DatetimeIndexに含まれる「時」 Int64Index([3, 8, 13], dtype='int64', name='YMDHMS')
print(df.index[0].hour) #1行目の時間 3
「分」を取り出す, minute
print(df.index.minute) #DatetimeIndexに含まれる「分」 Int64Index([4, 9, 14], dtype='int64', name='YMDHMS')
print(df.index[0].minute) #1行目の「分」 4
「秒」を取り出す, second
print(df.index.second) #DatetimeIndexに含まれる「秒」 Int64Index([5, 10, 15], dtype='int64', name='YMDHMS')
print(df.index[0].second) #1行目の「秒」 5
「時, 分, 秒」を取り出す, time
display(df.index[0].time) #1行目の(時, 分, 秒)。これでは取り出せず。 <built-in method time of Timestamp object at 0x115d0fa48> print(df.index.time[0]) #こっちなら取り出せる。 03:04:05
世界にたった一つ、あなただけのドメインを登録しよう!
datetime.time型などで時間や日時(datetime)を指定して行を取り出す, loc
print(df.loc[datetime.time(3,4,5)]) # (03:04:05)のdatetime型の時間をdatetime.timeにて指定 a b c YMDHMS 2020-01-02 03:04:05 a0 b0 c0
print(df.loc[datetime.datetime(2020, 1, 2, 3, 4, 5 )]) # "2020-01-02 03:04:05"をdatetime.datetimeで指定 a a0 b b0 c c0 Name: 2020-01-02 03:04:05, dtype: object
なお、
print(df.loc[datetime.date(2020, 1, 2)])
とか
print(df.loc[datetime.datetime(2020, 1, 2, 3, 4)])
のように全部含めていない書き方だとエラーで受け付けてくれない。。。
文字列にしとけば年月日まででも表示してくれる
print(df.loc[str(datetime.date(2020, 1, 2))])# datetime.dateを文字列にすると受け付けてくれる a b c YMDHMS 2020-01-02 03:04:05 a0 b0 c0
でもdatetime.datetimeの場合は一部だけで引っ張ろうとしてもエラーになる
print(df.loc[str(datetime.datetime(2020, 1, 2, 3, 4))]) #これはエラーになる
文字列で時間や日時を指定して行を取り出す, loc
#文字列で日時を指定 print(df.loc['2020']) print(df.loc['2020-01']) print(df.loc['2020-01-02']) print(df.loc['2020-01-02 03']) print(df.loc['2020-01-02 03:04']) #別にlocなしでもよかったわい。。。 print(df['2020']) print(df['2020-01']) print(df['2020-01-02']) print(df['2020-01-02 03']) print(df['2020-01-02 03:04']) #以上全部次の結果。(今回は条件に当てはまるのが1行だけなので全部同じ結果に) a b c YMDHMS 2020-01-02 03:04:05 a0 b0 c0 print(df.loc['2020-01-02 03:04:05']) #最後まできっちり #または print(df['2020-01-02 03:04:05']) a a0 b b0 c c0 Name: 2020-01-02 03:04:05, dtype: object
時間だけでは受け付けてくれない。
print(df.loc['03:04:05']) #これだとエラー
なので、時間の指定だけで抽出したい場合は
df.loc[datetime.date(3, 4, 5)]
でやる。
indexとcolumnを指定してvalueを取り出す
print(df['2020']['a']) #2020を含むindexとcolumnがaのところ YMDHMS 2020-01-02 03:04:05 a0 Name: a, dtype: object
print(df.loc['2020']['a']) #locも YMDHMS 2020-01-02 03:04:05 a0 Name: a, dtype: object
print(df.loc[datetime.datetime(2020, 1, 2, 3, 4,5)]['a']) #datetime.datetimeでも a0
display(df.iloc[0][0]) #行番号、列番号で位置指定するときはiloc a0
display(df.iloc[0][0:2]) #スライスも a a0 b b0 Name: 2020-01-02 03:04:05, dtype: object
display(df.at[datetime.datetime(2020,1,2, 3, 4, 5), 'a']) #atでも a0
display(df[['b', 'c']]) #カラムを複数指定でも。 b c YMDHMS 2020-01-02 03:04:05 b0 c0 2021-06-07 08:09:10 b1 c1 2022-11-12 13:14:15 b2 c2
display(df.iat[0, 1]) #iatでも行番号、列番号で b0
display(df.at[df.index[0], 'a']) #行番号とカラム名 a0
display(df.at[df['2020'], 'a']) #これはエラー。。。
タイムゾーン の確認と設定, tzinfo(), tz_localize(), tz_convert()
print(df.index.tzinfo) #タイムゾーンを確認 None #まだ設定されていない #タイムゾーンの設定 df.index = df.index.tz_localize('Asia/Tokyo') df.index = df.index.tz_convert('Asia/Tokyo') print(df.index.tzinfo) Asia/Tokyo #設定された。 print(df) #+09:00が追加されていてそれとわかる a b c YMDHMS 2020-01-02 03:04:05+09:00 a0 b0 c0 2021-06-07 08:09:10+09:00 a1 b1 c1 2022-11-12 13:14:15+09:00 a2 b2 c2
pythonのdatetime.datetimeオブジェクトをpandasのdatetime(Timestamp)に変換, to_datetime()
mae = datetime.datetime(2020,1,2,3,4,5) print(mae) 2020-01-02 03:04:05 print(type(mae)) <class 'datetime.datetime'> ato = pd.to_datetime(mae) print(ato) 2020-01-02 03:04:05 print(type(ato)) <class 'pandas._libs.tslibs.timestamps.Timestamp'>
ちょっと広告です
https://business.xserver.ne.jp/
https://www.xdomain.ne.jp/
★LOLIPOP★
.tokyo
MuuMuu Domain!
このブログはエックスサーバー で運営しております。
WordPressを使うならロリポップ!
簡単インストール完備で楽々スタート!
世界にたった一つ、あなただけのドメインを登録しよう!
格安ドメイン取得サービス─ムームードメイン─