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

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

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

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

Q&A

解決済

4回答

5219閲覧

csvから特定の年月抽出と同時に計算処理を行う

mrk_5200

総合スコア17

Python

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

0グッド

2クリップ

投稿2018/10/15 12:08

以下のような日付とそれに対応する値が存在するcsvファイルを読み込んだとします。
date      A
1998/1/12   32
1995/4/20   23
2010/12/6   64
2017/6/3    5
2014/2/9    11
2018/7/8    29
2005/9/25   10
2010/12/30   55
: :
: :
: :
そこで例えば、2010/12の年月を抽出後、その抽出された日付の値を全て足し合わせるという単純な計算処理をし、出力したいのですが、それが中々できませんでした。何か方法はありませんでしょうか。
ちなみに以下のようなコードで実行しましたが、上手くできなかったです。

import numpy as np import pandas as pd df = pd.read_csv("test.csv") df_201012 = np.sum((df[df["date"].isin(["1990/12"])].A))

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

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

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

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

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

guest

回答4

0

Pythonなど不要。そう、シェル芸ならね!

bash

1$ cat test.csv 2date,A1 31998/1/12,32 41995/4/20,23 52010/12/6,64 62017/6/3,5 72014/2/9,11 82018/7/8,29 92005/9/25,10 102010/12/30,55 11 12$ cat test.csv|tr '/' ','|awk -F, 'NR>1{a[$1"/"$2]+=$4}END{for(i in a){print i,a[i]}}' 132010/12 119 142018/7 29 151998/1 32 162014/2 11 171995/4 23 182005/9 10 192017/6 5

投稿2018/10/15 14:41

hichon

総合スコア5737

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

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

mrk_5200

2018/10/16 04:50

ありがとうございます!
guest

0

ベストアンサー

まずは基本的に、日時データはDatetime型にて読み込んでください

Python

1df = pd.read_csv("test.csv", parse_dates=['date'])

これは下のように書いても良いです

Python

1df = pd.read_csv("test.csv") 2df['date'] = pd.to_datetime(df['date'])

このように日時データをDatetime型で読み込むことで、
12月の全データを

Python

1df.loc[df['date'].dt.month == 12]

のように簡単に指定できるようになります。

あとは2010年12月のデータは

Python

1df.loc[(df.date.dt.year == 2010) & (df.date.dt.month == 12)]

で指定できるので A列のデータを取得し、

Python

1df.loc[(df.date.dt.year == 2010) & (df.date.dt.month == 12),'A']

合計をとるだけです

Python

1df.loc[(df.date.dt.year == 2010) & (df.date.dt.month == 12), 'A'].sum()

投稿2018/10/15 12:52

編集2018/10/15 12:57
magichan

総合スコア15898

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

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

0

numpy, panda を使わずに書いてみました。
test.csv (TAB 区切り)

date A 1998/1/12 32 1995/4/20 23 2010/12/6 64 2017/6/3 5 2014/2/9 11 2018/7/8 29 2005/9/25 10 2010/12/30 55 2005/9/25 1000 2005/9/25 2000 2005/9/25 3000

csv_read.py

python3

1import csv 2from itertools import groupby 3 4csv_file = open("./test.csv") 5f = csv.reader(csv_file, delimiter="\t") 6 7header = next(f) # ヘッダ列をスキップする 8result = [(k, sum([int(item[1]) for item in g])) 9 for (k, g) in groupby(sorted(f), lambda x: x[0])] 10print(result)

実行例
イメージ説明

全レコードで日付けごとに集計してますが、適宜 ターゲットの日付けだけでフィルタリングすれば良いです。

投稿2018/10/15 12:51

編集2018/10/15 12:53
katoy

総合スコア22324

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

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

mrk_5200

2018/10/16 04:49

ありがとうございます!!
guest

0

ファイルから読み込む。

csv

1date,A 21998/1/12,32 31995/4/20,23 42010/2/6,64 52010/2/3,5 62010/2/9,11 72018/7/8,29 82005/9/25,10 92010/12/30,55
import pandas as pd df = pd.read_csv('test.csv')

抽出する。

extract_df = df[df['date'].str.contains("2010/2")]

集計する。

extract_df['A'].sum() # 80

投稿2018/10/15 12:38

編集2018/10/15 15:45
tiitoi

総合スコア21956

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

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

mrk_5200

2018/10/16 04:49

ありがとうございます!試してみます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問