

下記のようにDataFrameのshapeを、  
yyyymm(年月)の数値で対象を1か月分ごと増やして  
抽出していきたいのですが（中身の処理はあくまで例です）、  
下記の書き方だと12月分の次以降は201713となってしまいうまくいきません。

yyyymmの値を年月の形で更新する書き方を教えていただけませんでしょうか？

[code]

    list = range(0,10)
       i = 201710
       for x in list:
       df_new = df[df['nengetsu'] <= i]
       print(df_new.shape)    
       i = i + 1
     print("end")
    
[/code]


CC BY-SA 3.0
2018-04-15T14:23:18.613
43272
2018-04-15T23:50:34.400
27306
question
python
繰り返し構文におけるyyyymmの更新について


`i = i + 1`の下に式を追加して、12月の次を翌年の1月にしてやればできます。

[code]

    if (i % 100) == 13:
        i += 88 
    
[/code]

また、numpyの`datetime64`は月を単位にできるので、次のようにシンプルに書くことができます。

[code]

    sr = pd.Series(np.arange('2017-10', 10, dtype='datetime64'))
    for x in sr:
        df_new = df[df['nengetsu'] <= x.year * 100 + x.month]
        print(df_new.shape)
    
[/code]


CC BY-SA 3.0
2018-04-15T15:47:54.883
43278
2018-04-15T16:17:32.927
2018-04-15T16:17:32.927
15171
15171
43272
answer


pandas を使用しているのであれば **pandas.date_range()** を使用するとよいのではないでしょうか。  
また 'nengetsu' Column はint型ではなくdatetime型として扱うべきかと思います。

以下に簡単なサンプルを書きます。

[code]

    import pandas as pd
    
    # 適当なデータを生成
    df = pd.DataFrame({
        'nengetsu': [201710,
                     201711,
                     201712,
                     201712,
                     201801,
                     201801,
                     201802,
                     201804,
                     201806,
                     201806]
    })
    
    # "nengetsu" columnは datetime型に変換
    df['nengetsu'] = pd.to_datetime(df['nengetsu'], format='%Y%m')
    
    # 質問のコードは以下のように修正できます
    for i in pd.date_range('2017/10', periods=10, freq='M'):
        df_new = df[df['nengetsu'] <= i]
        print(df_new.shape)
    print("end")
    
[/code]

また最終的に何を得たいのかが、いまいとつ理解できていないのですが、単に月毎のカウント値を得たいのであれば、 **DataFrame.resample()**
や **DataFrame.groupby()** を使用したほうが、ループを使用するよりも圧倒的に楽（＆高速）です

[code]

    print(df.set_index('nengetsu').resample('MS').size())
    
[/code]


CC BY-SA 3.0
2018-04-15T23:50:34.400
43280
2018-04-15T23:50:34.400
24801
43272
answer