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

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

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

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

pandas

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

Q&A

解決済

2回答

811閲覧

連続する日付の差分の計算

komaki

総合スコア7

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

pandas

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

0グッド

1クリップ

投稿2018/01/18 12:43

###前提・実現したいこと
下記の左端のような、dateのログが入ったデータフレームを、日付の連続性で区別したいですが方法がわかりません。

カラム("difference")を1列追加して、後の行の日付との差分を取得し、
差分が3未満であれば連続したログとみなし、
3以上であれば、1つの連続するログの最終行とみなし、次の行で新しいlog_numberをつける方法でかんがえてみましたが、うまく書けませんでした。

date difference log_number

2012-01-01 00:00:00 0 1
2012-01-01 00:00:00 1 1
2012-01-02 00:00:00 1 1
2012-01-03 00:00:00 362 1
2012-12-30 00:00:00 1 2
2012-12-31 00:00:00 2 2
2013-01-02 00:00:00 ? 2
2014-04-15 00:00:00 466? 3
2014-04-18 00:00:00 - 4

稚拙な説明文ですみませんが教えていただけると幸いです。
Python2.7を使っています

`

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんな感じでどうでしょう

Python

1import numpy as np 2import pandas as pd 3 4df = pd.DataFrame({'date':['2012-01-01 00:00:00', 5 '2012-01-01 00:00:00', 6 '2012-01-02 00:00:00', 7 '2012-01-03 00:00:00', 8 '2012-12-30 00:00:00', 9 '2012-12-31 00:00:00', 10 '2013-01-02 00:00:00', 11 '2014-04-15 00:00:00', 12 '2014-04-18 00:00:00']}) 13 14# date column を時系列データに変換 15df['date'] = pd.to_datetime(df['date']) 16# difference column に差分データをいれる 17df['difference'] = (df['date'].shift(-1) - df['date']).dt.days 18# difference >= 3 を条件に区分データを生成 (先頭と最後のデータも含める) 19bins = df[(df.index==0) | (df.difference>=3) | df.difference.isnull()].date 20# 上記の区分データでグループ分け 21grouped_df = df.groupby(pd.cut(df.date, bins, include_lowest=True)) 22# グループ番号(+1)を''に追加 23df[' log_number'] = grouped_df.ngroup() + 1 24 25print(df) 26# date difference log_number 27# 0 2012-01-01 0.0 1 28# 1 2012-01-01 1.0 1 29# 2 2012-01-02 1.0 1 30# 3 2012-01-03 362.0 1 31# 4 2012-12-30 1.0 2 32# 5 2012-12-31 2.0 2 33# 6 2013-01-02 468.0 2 34# 7 2014-04-15 3.0 3 35# 8 2014-04-18 NaN 4

投稿2018/01/19 01:01

magichan

総合スコア15898

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

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

0

こんなのでどうでしょう?

python

1import numpy as np 2import pandas as pd 3import datetime as dt 4import math 5 6dformat = '%Y-%m-%d %H:%M:%S' 7df1 = pd.DataFrame({"date":( 8"2012-01-01 00:00:00", 9"2012-01-01 00:00:00", 10"2012-01-02 00:00:00", 11"2012-01-03 00:00:00", 12"2012-12-30 00:00:00", 13"2012-12-31 00:00:00", 14"2013-01-02 00:00:00", 15"2014-04-15 00:00:00", 16"2014-04-18 00:00:00")}) 17 18df1["difference"] = [ 19 ( 20 dt.datetime.strptime(df1.date[x+1], dformat)- 21 dt.datetime.strptime(df1.date[x], dformat) 22 ).days 23 for x 24 in range(len(df1.index)-1) 25] + [np.nan] 26 27logno = [] 28j=1 29for i in range(len(df1.index)): 30 logno.append(j) 31 if not(math.isnan(df1.difference[i])): 32 if df1.difference[i]>=3: 33 j += 1 34df1["log_number"] = logno 35print(df1)

投稿2018/01/18 14:36

KojiDoi

総合スコア13671

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問