2017-12-23 6 views
0

私はこのファイルを読み込もうとしている費用ファイルを持っており、毎日のログを作成しています。数年に及ぶファイルの小さなサブセットは、私がチェックや貯蓄の開始値を含む変数checking_startsavings_startで始まる私のコードではデータフレーム形式のPandas経費ファイルから毎日のアカウントログを作成

Date,Checking_Debit,Checking_Addition,Savings_Debit,Savings_Addition 
2015-01-07,342.1,0.0,0.0,0.0 
2015-01-07,981.0,0.0,0.0,0.0 
2015-01-07,3185.0,0.0,0.0,0.0 
2015-01-05,55.0,0.0,0.0,0.0 
2015-01-05,75.0,0.0,0.0,0.0 
2015-01-03,287.0,0.0,0.0,0.0 
2015-01-02,64.8,0.0,0.0,0.0 
2015-01-02,75.0,0.0,0.0,75.0 
2015-01-02,1280.0,0.0,0.0,0.0 
2015-01-02,245.0,0.0,0.0,0.0 
2015-01-01,45.0,0.0,0.0,0.0 

1月、2015年には数日間、以下の通りでありますアカウント。コードに開始日と終了日を与え、コードを毎日繰り返し、その日に費用がかかっていないかどうかを確認し、チェックと貯蓄の引落を差し引いて、チェックと貯蓄の追加を追加します。その日に費用がかかっていない場合は、前日と同じ値にアカウントを保持する必要があります。さらに、私は実装のPandasデータフレームに自分自身を制約しようとしています。これまでのところ私のコードはこのように見えます。パンダモジュールとPython的形式で

import pandas as pd 
from date time import date 
check_start = 8500.0 
savings_start = 4000.0 
start_date = date(2017, 1, 1) 
end_date = date(2017, 1, 8) 
df = pd.read_csv(file_name.csv, dtype={'Date': str, 'Checking_Debit': float, 
             'Checking_Addition': float, 
             'Savings_Debit': float, 
             'Savings_Addition': float}) 

、どのように私はそれらの日の費用や経費があるかどうかを確認、その後、一度に1日、終了日に開始日からウォークスルーんし、その後チェックと貯蓄からそれを引きます。最後に、私は各日付の当座預金口座の価値の配列を持ち、その日の貯蓄口座のための配列を持っているはずです。

結果は、次の形式の別の.csvファイルに書き込まれる配列である必要があります。あなたが提供されたデータを読み取り、より良いデータ操作のための指標として、それは

import pandas as pd 

df = pd.read_csv(r"dat.csv", parse_dates=[0],dtype={'Checking_Debit': float, 
                   'Checking_Addition': float, 
                   'Savings_Debit': float, 
                   'Savings_Addition': float}) 

設定日でデータの日付列を識別することにより

Date,Checking,Savings 
2017-01-07,1865.1,3925.0 
2017-01-06,6373.2,3925.0 
2017-01-05,6373.2,3925.0 
2017-01-04,6503.2,3925.0 
2017-01-03,6503.2,3925.0 
2017-01-02,6790.2,3925.0 
2017-01-01,8455.0,4000.0 
+0

出力をどのように表示するかの例を投稿できますか? –

+0

絶対に、私はちょうど望ましい出力を追加しました – Jon

+0

これまでに何を試しましたか?あなたが掲示した唯一のコードは、実際にはこの目的の試みを実証していません。ちょうどCSVを読み込んで変数を設定するだけです。 –

答えて

1

スタート。

df = df.set_index("Date") 

は、各日付

grp_df = df.groupby('Date').sum() 

に今ループ

check_start = 8500.0 
savings_start = 4000.0 
start_date = pd.to_datetime('2015/1/1') 
end_date = pd.to_datetime('2015/1/8') 
delta = pd.Timedelta('1 days') # time that needs to be added to start date 

ためのすべての変数グループの費用データWRTを初期化し、毎日のための経費報告書を作成するために今、私たちはwhileループを行います

expense_report = [] 
while start_date<=end_date: 
    if start_date in df.index: 
     savings_start += (grp_df.loc[start_date,"Savings_Addition"]-grp_df.loc[start_date,"Savings_Debit"]) 
     check_start += (grp_df.loc[start_date,"Checking_Addition"]-grp_df.loc[start_date,"Checking_Debit"]) 
     expense_report.append([start_date,check_start,savings_start]) 
    elif start_date not in df.index: 
     expense_report.append([start_date,check_start,savings_start]) 

    start_date += delta 
あなたがあなたの元にsaving_addition列に75値を持っているので、省列の値ではなく、3925.0で4075ある:あなたが

df_exp_rpt.to_csv("filename.csv") 

注意してCSVに保存することができますDataframe

df_exp_rpt = pd.DataFrame(expense_report,columns=["Date","Checking","Savings"]) 



print(df_exp_rpt) 
     Date Checking Savings 
0 2015-01-01 8455.0 4000.0 
1 2015-01-02 6790.2 4075.0 
2 2015-01-03 6503.2 4075.0 
3 2015-01-04 6503.2 4075.0 
4 2015-01-05 6373.2 4075.0 
5 2015-01-06 6373.2 4075.0 
6 2015-01-07 1865.1 4075.0 
7 2015-01-08 1865.1 4075.0 

をパンダする

変換expense_reportリストデータ

+0

ありがとうございましたSahil、これは良いスタートですが、これまでのところ同じ問題が発生しています。当時は費用がかからなかったため、1月4日と1月6日に解決策を打ちました。しかし、あなたの解決策を見ると、 'if if start_date in dfの後にelse文を置くことができます。その問題を処理できるはずの 'index'行です。 – Jon

+0

@ジョン私は答えを更新しました –

関連する問題