質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.91%

日付からフラグを付ける

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 1,203

midsum0323

score 37

以下のようなdata内の開始月・終了月のデータから月ごとに継続フラグを付けたいです。

開始月         
0 201602
1 201602 
2 201601
3 201603

終了月
0 201701 
1 201612
2 201701
3 201702


201601 201602 201603 … 201611 201612  201701 201702
0      0      1     1       1      1     1     0
1      0      1     1       1      1     0     0  
2      1      1     1       1      1     1     1     
3      0      0     1       1      1     1     0     

data は pandasのDataFrameに格納されています。

環境 
3.6.0 |Anaconda 4.3.0 (64-bit)| (default, Dec 23 2016, 11:57:41) [MSC v.1900 64 bit (AMD64)]  
In [ ]:

よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • shimizukawa

    2017/05/02 10:37

    やってみたこと、うまくいかなかったこと、その時のコード、エラー文、結果、等を書いてください。

    キャンセル

  • Lhankor_Mhy

    2017/05/02 13:24

    補足願います。0行目の終期が201701・フラグの201612は0、2行目の終期が201701・フラグの201612は1、でした。同じ終期に対して違うフラグが付いているようなので、ここに書かれていない条件があるのだと思いますので、そちらをご提示ください。

    キャンセル

回答 2

checkベストアンサー

0

サンプルを挙げておきます。

data.csv

開始月,終了月
201602,201701
201602,201612
201601,201701
201603,201702
import pandas as pd

# データ読み込み
myparser = lambda x: pd.datetime.strptime(x, '%Y%m')
df = pd.read_csv("data.csv",
                 parse_dates=['開始月','終了月'],
                 date_parser=myparser)
# New DataFrame生成部
lst = []
for d in pd.date_range('20160101', '20170501',freq='MS'):
    s = (df['開始月'] <= d) & (df['終了月'] >= d)
    lst.append(s.rename(d.strftime("%Y/%m")).astype(int))
df = pd.concat(lst, axis=1)

print(df)

簡単に手順を説明すると

  1. pandas.date_range() で column_name となる 1月毎の日付データを生成する。
  2. 上記の日付データでループを回して、元データの開始月、終了月の範囲内かの Boolean List(pandas.Series)を生成
  3. 上記のBoolean Listをint(0 or 1)に変換
  4. 上のSeriesを pandas.concat() にて pandas.DataFrame() にまとめる

となっております。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

フラグをつけたい月が開始月以降でかつ終了月以前なら 1 を、そうでなければ 0 を出力すればいいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/02 09:46

    一度に作ろうとするから混乱するのです。できるところからボトムアップで作っていきましょう。まずはループを使わず、元データと対象月から 1 または 0 を返す関数を作り、質問文を編集して「ここまでできました」と掲示してください。その際、</> を使ってコード表記にするのを忘れないようにし、プレビューを見ながら編集してください。

    キャンセル

  • 2017/05/02 14:33

    もう一度整理してみます

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る