DataFrameを使う上での備忘録あれこれ。解決していないやり方も書いていくつもりですので、その点はご了承ください。
日付関係
Excelファイルから日付データの読み込み
pd.read_excel
かpd.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)
次は何を書こうか…