LoginSignup
1
4

More than 1 year has passed since last update.

DataFrame備忘録

Last updated at Posted at 2019-02-17

DataFrameを使う上での備忘録あれこれ。解決していないやり方も書いていくつもりですので、その点はご了承ください。

日付関係

Excelファイルから日付データの読み込み

pd.read_excelpd.ExcelFile.parseで読み込み。エクセルの書式設定でYYYY/M/Dとなっている場合は、自動的に日付データとして認識されるので、それ以外の場合での引数convertersの設定方法。

"YYYYMMDD"形式(文字列)

date
"20190131"
"20190228"
"20190331"
pd.read_excel('foo.xlsx', converters={'date':pd.Timestamp})

YYYYMMDD形式(数値)

date
20190131
20190228
20190331
def from_int(x):
    return pd.Timestamp(str(x))

pd.read_excel('foo.xlsx', converters={'date':from_int})

あるいは、ラムダ式を使って

pd.read_excel('foo.xlsx', converters={'date':lambda x:pd.Timestamp(str(x))})

Excelのシリアル値

date
43861
43890
43921
def from_serial(x):
    #-25569 = pd.Timestamp('1899-12-30').to_julian_date()
    #        - pd.Timestamp('1970-1-1').to_julian_date()
    return pd.Timestamp(x-25569, unit='D')

pd.read_excel('foo.xlsx', converters={'date':from_serial})

もちろんラムダ式を使っても可。
↓気になる人は気になる。
http://d.hatena.ne.jp/bonlife/touch/20071016/1192526451

日付のオフセット

月末かどうか

Timestampのアトリビュートを使用

pd.Timestamp('20190130').is_month_end
# False
pd.Timestamp('20190131').is_month_end
# True
pd.Timestamp('20190201').is_month_end
# False

offsetsを使用

pd.offsets.MonthEnd().onOffset(pd.Timestamp('20190130'))
# False
pd.offsets.MonthEnd().onOffset(pd.Timestamp('20190131'))
# True
pd.offsets.MonthEnd().onOffset(pd.Timestamp('20190201'))
# False

月末日へオフセット(月末日はそのまま)

pd.offsets.MonthEnd().rollforward(pd.Timestamp('20190131'))
# Timestamp('2019-01-31 00:00:00')
pd.offsets.MonthEnd().rollforward(pd.Timestamp('20190131'))
# Timestamp('2019-01-31 00:00:00')
pd.offsets.MonthEnd().rollforward(pd.Timestamp('20190201'))
# Timestamp('2019-02-28 00:00:00')

MultiIndex

↓に移動しました。
https://qiita.com/k_maki/items/f31db2ec797d73393672

その他

Update and Insert(Upsert的な)

df1:
                    A      B
    date
    '2015-10-01'  'A1'   'B1'
    '2015-10-02'  'A2'   'B2'
    '2015-10-03'  'A3'   'B3'

df2:
    date            A      B
    '2015-10-02'  'a1'   'b1'
    '2015-10-03'  'a2'   'b2'
    '2015-10-04'  'a3'   'b3'

↑から↓を作りたい。10/2と10/3は更新(update)し、10/4を追加(insert)する。

df3:
                    A      B
    date
    '2015-10-01'  'A1'   'B1'
    '2015-10-02'  'a1'   'b1'
    '2015-10-03'  'a2'   'b2'
    '2015-10-04'  'a3'   'b3'
df3 = df1.copy()
df3.update(df2)
df3 = pd.concat([df3, df2.loc[~df2.index.isin(df3.index)]], sort=True)

次は何を書こうか…

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4