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

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

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

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

4613閲覧

csvの売上データを、日ごとで集計したい

ForestBamboo

総合スコア17

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

1クリップ

投稿2020/06/20 11:46

初歩的な質問となり大変恐縮ですが、何卒よろしくお願いします。
下記の様なCSVデータをpythonに取り込んで、日ごとに集計したいと考えております。

【csvデータ】
購入日時            売上
2018年09月05日 22:04     1,000
2018年09月06日 11:31     2,000
2018年09月06日 15:43     1,000
2018年09月10日 11:05     500
2018年09月10日 11:28     2,000
2018年09月10日 14:06     3,000

下記の様に日ごとに集計したいと考えております。
【理想】
購入日時           売上
2018年09月05日       1,000
2018年09月06日       3,000
2018年09月10日       5,500

pd.read_csvにて全データを取り込むところまで行ってるとして、

この後の考え方としては
A:
①購入日時の日付型を年月日に変更した列を作成する
②変更した列を元のデータに追加する
③追加した列を元に、日ごとに集計する

もしくは

B:
①購入日時をスペースで区切り、年月日の列を作成する
②作成した列を元のデータに追加する
③追加した列を元に、日ごとに集計する
であってますでしょうか。

そもそも購入日時のカラムを変更して追加せずとも、日ごとに集計することは可能なのでしょうか。。

何卒、よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

そもそも購入日時のカラムを変更して追加せずとも、日ごとに集計することは可能なのでしょうか。。

色々な方法があると思いますが、私ならインデックスをpd.DateTimeIndexにしてリサンプリングします。

python

1df.index = pd.DatetimeIndex( 2 pd.to_datetime(df["購入日時"], format="%Y年%m月%d日 %H:%M") 3) 4df_1day = df.resample("1D").sum()) 5print(df_1day)

結果

terminal

1 売上 2購入日時 32018-09-05 1000 42018-09-06 3000 52018-09-07 0 62018-09-08 0 72018-09-09 0 82018-09-10 5500

投稿2020/06/21 03:32

yymmt

総合スコア1615

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

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

kabayan55

2020/06/21 07:12

こんなにスマートに書けるんですね!pd.DateTimeIndexもresampleも知らなかったので勉強になりました。
ForestBamboo

2020/06/22 07:58

ご回答頂きましてありがとう御座いました。 まだ理解が追い付いていないところがあるのですが、カラムを新規で追加するという形ではなく、インデックスを指定のデータ型に変更して集計すると認識させて頂きました。 初めて見る関数がありますので、しっかりと理解していこうと思います。
guest

0

ベストアンサー

方針としては、A案でもB案でも良いように思います。もし今後日付以外に、年ごとや月ごとで集計する可能性があればB案、そうでなければA案で良いのではないかと思います。

そもそも購入日時のカラムを変更して追加せずとも、日ごとに集計することは可能なのでしょうか。。

時刻の部分があると、そのままgroupbyしようとすると、分単位の集計になってしまうので、購入日のカラムを作る処理は必要です。

pd.read_csvにて全データを取り込むところまで行ってるとして、

csvデータから読み取るのでしたら、まず購入日時をstr型あるいはdatetime型、売上をint型で読み込むといいと思います。売上は、もし","がcsvの方で入っていたらint型で読み込めないかもしれないので、その場合は文字列として読み込んで、"," を除去した上でint型にすればいいかなと思います。
df["売上"].map(lambda x: int(x.replace(",","")))

csvデータを読み込んだ形の以下のようなDataFrameがあると仮定して、回答します。

Python

1df = pd.DataFrame([ 2 ["2018年09月05日 22:04", 1000], 3 ["2018年09月06日 11:31", 2000], 4 ["2018年09月06日 15:43", 1000], 5 ["2018年09月10日 11:05", 500], 6 ["2018年09月10日 11:28", 2000], 7 ["2018年09月10日 14:06", 3000]], 8 columns=["購入日時", "売上"])

A案について

A:①購入日時の日付型を年月日に変更した列を作成する

方針は大きく2つあって、
0. str型で読み込んで、正規表現で年月日に一致する部分のみ取得
0. datetime型で読み込んで、型は変更しないまま日付部分のみを取得

と同じ型のまま処理する方が楽です。

前者のstr型の処理は、
0. 年月日に当てはまる部分の取得
0. スペースの前までを取得

など書き方はいろいろありますが、前者でやってみます。

# 正規表現で年月日を抜き出す import re def str_ymd(x): m = re.search(r"([0-9]+)年([0-9]+)月([0-9]+)日", x) x = m[0] return x # 購入日カラム作成 df["購入日"] = df["購入日時"].map(lambda x: str_ymd(x)) # 元のカラム削除 del df["購入日時"] # 購入日ごとの売上の合計額 df = df.groupby("購入日").sum().reset_index()

B案について

B:①購入日時をスペースで区切り、年月日の列を作成する

こちらの場合は、文字列としての処理でも、datetime型としての処理でも、スペースで区切る必要はないと思います。
文字列の場合は、正規表現でマッチするものを年・月・日それぞれで取ってこれます。
datetime型の場合は、そのまま欲しい部分のみ指定できます。

「年」「月」「日」とカラムを3つ作って、int型で入れるのが良いかと思います。

投稿2020/06/20 14:13

編集2020/06/20 14:20
kabayan55

総合スコア389

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

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

ForestBamboo

2020/06/22 07:54

ご丁寧にご回答頂き有難う御座いました。 正規表現で一致したデータを取得、カラムを新規作成・追加して集計するという事ですね。 非常に勉強になりました。方法はよく理解することが出来たのですが、ご教示頂いた内容内に、まだわからない関数があるのでこれから時間をかけて消化していこうと思います。 ※勝手に回答依頼投げてすみませんでした。ご迷惑であれば控えさせて頂きますので、よろしくお願いします。
kabayan55

2020/06/22 13:31

お役に立てたようで良かったです。 回答依頼、問題ありません。全くわからない場合以外は回答できると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問