DatetimeIndexがわからんので逆引きでまとめとくの巻

DatetimeIndexがわからんので逆引きでまとめとくの巻

はじめに

pandasでDatetimeIndexにした途端にわけがわからなくなり、
毎度毎度調べては情報の海で溺れがちなのでここにメモっておくことにしました。
目次から選択して該当事項へ飛ぶのです。

詳細はpandas公式サイト等で確認するとして。

事例に使うデータとpandasとPython

次のDataFrameをdfという変数に格納して使用することにします。

pandas_dateframe_data

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

pandas_dateframe_data
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

pandas_dateframe_data
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

pandas_dateframe_data
print(df.index.year) #DatetimeIndexに含まれる年

Int64Index([2020, 2021, 2022], dtype='int64', name='YMDHMS')
print(df.index[0].year) #1行目の年

2020

「月」を取り出す, month

pandas_dateframe_data
print(df.index.month) #DatetimeIndexの月

Int64Index([1, 6, 11], dtype='int64', name='YMDHMS')
print(df.index[0].month) #1行目の月

1

「日」を取り出す, day

pandas_dateframe_data
print(df.index.day) #DatetimeIndexの日

Int64Index([2, 7, 12], dtype='int64', name='YMDHMS')
print(df.index[0].day) #1行目の日
2

「年月日」を取り出す, date

pandas_dateframe_data
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

pandas_dateframe_data
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

pandas_dateframe_data
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()」を使います。

pandas_dateframe_data
print(df.index.day_name())

Index(['Thursday', 'Monday', 'Saturday'], dtype='object', name='YMDHMS')
print(df.index[0].day_name())

Thursday

「時」を取り出す, hour

pandas_dateframe_data
print(df.index.hour) #DatetimeIndexに含まれる「時」

Int64Index([3, 8, 13], dtype='int64', name='YMDHMS')
print(df.index[0].hour) #1行目の時間

3

「分」を取り出す, minute

pandas_dateframe_data
print(df.index.minute) #DatetimeIndexに含まれる「分」

Int64Index([4, 9, 14], dtype='int64', name='YMDHMS')
print(df.index[0].minute) #1行目の「分」

4

「秒」を取り出す, second

pandas_dateframe_data
print(df.index.second) #DatetimeIndexに含まれる「秒」

Int64Index([5, 10, 15], dtype='int64', name='YMDHMS')
print(df.index[0].second) #1行目の「秒」

5

「時, 分, 秒」を取り出す, time

pandas_dateframe_data
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

pandas_dateframe_data
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

pandas_dateframe_data
#文字列で日時を指定
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を取り出す

pandas_dateframe_data
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()

pandas_dateframe_data
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!

このブログはエックスサーバー で運営しております。


Word Press専用クラウド型レンタルサーバーwpX Speed


WordPressを使うならロリポップ!
簡単インストール完備で楽々スタート!

世界にたった一つ、あなただけのドメインを登録しよう!
格安ドメイン取得サービス─ムームードメイン─