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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3250閲覧

日付からフラグを付ける

midsum0323

総合スコア40

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2017/05/02 00:31

以下のような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 [ ]:

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shimizukawa

2017/05/02 01:37

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

2017/05/02 04:24

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

回答2

0

ベストアンサー

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

data.csv

開始月,終了月 201602,201701 201602,201612 201601,201701 201603,201702

Python

1import pandas as pd 2 3# データ読み込み 4myparser = lambda x: pd.datetime.strptime(x, '%Y%m') 5df = pd.read_csv("data.csv", 6 parse_dates=['開始月','終了月'], 7 date_parser=myparser) 8# New DataFrame生成部 9lst = [] 10for d in pd.date_range('20160101', '20170501',freq='MS'): 11 s = (df['開始月'] <= d) & (df['終了月'] >= d) 12 lst.append(s.rename(d.strftime("%Y/%m")).astype(int)) 13df = pd.concat(lst, axis=1) 14 15print(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() にまとめる

となっております。

投稿2017/05/02 07:43

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2017/05/02 00:36

Zuishin

総合スコア28656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2017/05/02 00:46

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

2017/05/02 05:33

もう一度整理してみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問