2017-03-14 21 views
0

私はcsvファイルを読み込み、日、週、月にデータをチャンクします。パンダ2日間、週は週曜日から開始します。

私の問題は、通常の午前12時から24時間チャンクされていることです。ただし、データは午後4時から午後4時までチャンクされます(翌日に入る)。

さらに、dt.weekは、月曜日にデータが開始されるため、月曜日の開始週を作成します。私は日曜日の午後4時 - 金曜日の午後4時を1週間としたい。私はこれを索引でやっていくことができますし、より洗練されたソリューションがあるのか​​どうか疑問に思っていました。

目的:この5分のデータ(df.head()を参照)を日、週、月単位でチャンクするデータフレームのリストを作成します。日のために、私は午後4時から始まり、翌日午後4時まで継続する必要があります。数週間、私は週が日曜日に始まるようにしたいと考えています。データは月曜日に始まるので、月曜日から週を分けたいと考えています。

def read_in_files(file_names): 
    """ 
    1. Read the csv files to memory into a pandas dataframe with pd.read_csv 
    2. separate the df into year, month, and date objects 
    3. It also chunks the data by single day 
    """ 
    import os 
    import pandas as pd 

    file1 = pd.read_csv(file_names, parse_dates=[['Date', 'Time']]) 

    df = pd.DataFrame(file1) 

# Week is defined as sunday 4pm to Friday 4pm --not working correctly 
# this is a timestamp obj 
    df['year'], df['month'] = df['Date_Time'].dt.year, df['Date_time'].dt.month 
    df['date'] = df['Date_Time'].dt.day 
    df['week'] = df['Date_Time'].dt.week 

    """ 
    these three lines below chunk the data by dates 
    """ 
    df_single_day = [] 
    for group in df.groupby(df.Date_Time, sort=False): 
     df_single_day.append(group[1]) 

    df_single_week = [] 
    for group in df.groupby(['week', 'year'], sort=False): 
     df_single_week.append(group[1]) 

    df_single_month = [] 
     for group in df.groupby(['month', 'year'], sort=False): 
     df_single_month.append(group[1]) 

    return df df_single_day, df_single_week, df_single_month 

出力例

df_single_day [0] .tail(5)

OUT [11]:

Unnamed: 0 Symbol  Date_Time  Open High  Low Close \ 
90   91 ABCDEF 2008-05-06 23:35 0.9480 0.9483 0.9477 0.9480 
91   92 ABCDEF 2008-05-06 23:40 0.9479 0.9482 0.9476 0.9479 
92   93 ABCDEF 2008-05-06 23:45 0.9478 0.9481 0.9474 0.9477 
93   94 ABCDEF 2008-05-06 23:50 0.9477 0.9481 0.9472 0.9478 
94   95 ABCDEF 2008-05-06 23:55 0.9479 0.9481 0.9475 0.9478 
year month date week 
90 2008  5  6 19 
91 2008  5  6 19 
92 2008  5  6 19 
93 2008  5  6 19 
94 2008  5  6 19 

df_single_day [1] .head(5)

Out [14]:

Unnamed: 0 Symbol  Date_Time  Open High  Low Close \ 
95   96 ABCDEF 2008-05-07 00:00 0.9478 0.9483 0.9475 0.9481 
96   97 ABCDEF 2008-05-07 00:05 0.9481 0.9484 0.9479 0.9484 
97   98 ABCDEF 2008-05-07 00:10 0.9482 0.9485 0.9480 0.9482 
98   99 ABCDEF 2008-05-07 00:15 0.9482 0.9485 0.9478 0.9483 
99   100 ABCDEF 2008-05-07 00:20 0.9483 0.9485 0.9480 0.9484 
    year month date week 
95 2008  5  7 19 
96 2008  5  7 19 
97 2008  5  7 19 
98 2008  5  7 19 
99 2008  5  7 19 

15時55分までの機能は、各リストのため00:00に始まるデータをチャンク、と私はそれが1日から午後4時から開始する次の日

+1

サンプル・データは、これがより簡単になるだろう。私はあなたの後ろのIIUCの巧妙な解決策があなたのチャンクを 'df.Date_Time + pd.offsets.Hour(8)' – piRSquared

+0

に基づいて作成することになるとは思っていません。物事を明確にするのに役立つことを願っています。 – Monty

+0

メソッドをグループ化のプレースホルダとして使用しました。ありがとうございました!まだ週の問題を把握しています。 – Monty

答えて

0
df['temp'] = df['Date'].astype(str) + ' ' + df['Time'] 
df.temp = pd.to_datetime(df.temp, infer_datetime_format=True) 
df.temp = df.temp + pd.offsets.Hour(8) 

g = df.groupby(df['temp'].dt.normalize()) 
df_single_day = [] 
for group in g: 
    if len(group[1])> 1: 
     df_single_day.append(group[1]) 

上記のコードは正しい答えを生成します。私はわずか16時間の週末のグループが単独であるため、わずかな(しかし重要ではない)問題があるので、if文でそれらを削除します。それでも週は私のデータは、月に開始できることを指定した日-日からのものであり、dt.weekは月 - 月を行くdt.weekような何かをする方法を考え出す

...

関連する問題