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

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

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

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

pandas

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

Q&A

解決済

2回答

705閲覧

pandasのdf(日付でソートされた)を1週間区切りで分けたいのですが

shin2167

総合スコア12

Python 3.x

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

pandas

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

0グッド

1クリップ

投稿2018/07/04 15:23

python初心者ですので不手際がありましたら申し訳ございません

説明が難しいので実際にデータで説明します
以下のようなdfがあります
実際はcsvファイルを読み込んでdfを作っていますが、今回は自身でdfを作成しました
df10 = pd.DataFrame({ 'tid' : [1, 2, 3, 4, 5],
'userid' : [1, 1, 1, 1, 1],
'latitude' : [1.1, 2.2, 3.3, 4.4, 5.5],
'longitude' : [11.1, 22.2, 33.3, 44.4, 55.5],
'date' : ['2017-01-01', '2017-01-05', '2017-02-05', '2017-02-05', '2017-04-03'],
'text' : ['a', 'b', 'c', 'd', 'e'] })

実際の各データの型はtid:int64、userid:int64、latitude:float64、longitude:float64、date:datetime64[ns]、text:objectになります(dateのみ異なります。今回は文字列になっています)
上記のようにuseridが同じ(一人のユーザのデータ)dfがあります
dateは日付でソートしてあります
これを1週間で区切り新しいカラム(仮にlabelとします)にラベルを付与したいです
具体的には以下のようなdfを作りたいです

df10_re = pd.DataFrame({ 'tid' : [1, 2, 3, 4, 5],
'userid' : [1, 1, 1, 1, 1],
'latitude' : [1.1, 2.2, 3.3, 4.4, 5.5],
'longitude' : [11.1, 22.2, 33.3, 44.4, 55.5],
'date' : ['2017-01-01', '2017-01-05', '2017-02-05', '2017-02-08', '2017-02-14'],
'text' : ['a', 'b', 'c', 'd', 'e'],
'label': ['1', '1', '2', '2', '3'] })

2017-01-01のデータは次のデータ(2017-01-05のデータ)と1週間以内なので同じラベルを付与します
2017-01-05のデータは次のデータ(2017-02-05のデータ)と1週間以上離れているので2017-02-05のデータには新たにラベルを付与します
2017-02-14のデータは2017-02-08から見れば1週間以内ですが2017-02-05から見れば1週間以上空いているので別のラベルを付与します

このように新しいラベルが付与された日から1週間以内のデータには同じラベルを付与します
*実際のカレンダー通りに1週間で区切りたいわけでは在りません
タイトルのニュアンスと異なると思うので注意してください
そして、次々と新しいラベルを付与していきます

説明分かりづらくて申し訳在りません
よろしくお願い致します

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

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

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

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

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

guest

回答2

0

解釈が正しいのかわかりませんが。

  1. datetimeの方にする
  2. 1ずらしたもの同士で引く
  3. daysにして、7以上のものをTrueそれ以外をFalse
  4. boolが0/1であることを利用してcumsumを取る

python

1import pandas as pd 2 3df10 = pd.DataFrame({ 'tid' : [1, 2, 3, 4, 5], 4'userid' : [1, 1, 1, 1, 1], 5'latitude' : [1.1, 2.2, 3.3, 4.4, 5.5], 6'longitude' : [11.1, 22.2, 33.3, 44.4, 55.5], 7'date' : ['2017-01-01', '2017-01-05', '2017-02-05', '2017-02-05', '2017-04-03'], 8'text' : ['a', 'b', 'c', 'd', 'e'] }) 9 10df10.date = pd.to_datetime(df10.date) 11df10["diff"] = df10.date - df10.date.shift(1) 12df10["over1week"] = df10["diff"].dt.days > 7 13df10["wid"] = df10.over1week.cumsum() 14print(df10)

投稿2018/07/04 22:42

mkgrei

総合スコア8560

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

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

shin2167

2018/07/05 01:46

ありがとうございます 参考にさせていただきます
guest

0

ベストアンサー

dateのそれぞれの日付について、date[0]を起点として何週目にあたるのかを求め、これを通し番号化してlabelとするということだと読み取りましたが、間違っていたらすみません。

週番号を求めるにはtimedelta, 通し番号化するにはnumpyのuniqueを使ってみました。

python

1from datetime import datetime, timedelta 2import numpy as np 3 4def day1(x): 5 return(datetime.strptime(x,"%Y-%m-%d")) 6 7# 対象データ 8a = ['2017-01-01', '2017-01-05', '2017-02-05', '2017-02-08', '2017-02-14'] 9 10# 週番号を求める 11b = [(day1(x)-day1(a[0])).days//7 for x in a] 12 13#週番号→通し番号 14u = np.unique(b) 15c = {k:v+1 for (k,v) in zip(u, range(len(u)))} 16 17label = [c[x] for x in b] 18print(label) 19

投稿2018/07/04 21:18

KojiDoi

総合スコア13671

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

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

shin2167

2018/07/05 01:46

ご回答ありがとうございます 大変参考になりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問