2017-04-26 13 views
2

私は巨大なデータフレームを持っています。以下は小さな例です:パンダのdatetimeの使用

Date  Timing Day_number 
17.03.2016  8  1 
17.03.2016  8  2 
17.03.2016  8  3 
17.03.2016  8  4 
17.03.2016  8  5 
17.03.2016  8  6 
17.03.2016  8  7 
17.03.2016  8  8 
30.08.2016  3  1 
30.08.2016  3  2 
30.08.2016  3  3 
31.05.2016  3  1 
31.05.2016  3  2 
31.05.2016  3  3 
... 

新しい列を追加する必要があります。私は、どのような値が列 "タイミング"にあるのか見ています。たとえば、値が8の場合、日付を見て、この場合の各行に1日を追加します。結果は、17.03.2016から24.03.2016の日付の8行です。 「タイミング」列の値は異なる場合があります。日付も異なります。この例では、次のようなものが必要です:

Date  Timing  Day_number  Distribution_of_days 
17.03.2016  8   1     17.03.2016 
17.03.2016  8   2     18.03.2016 
17.03.2016  8   3     19.03.2016 
17.03.2016  8   4     20.03.2016 
17.03.2016  8   5     21.03.2016 
17.03.2016  8   6     22.03.2016 
17.03.2016  8   7     23.03.2016 
17.03.2016  8   8     24.03.2016 
30.08.2016  3   1     30.08.2016 
30.08.2016  3   2     31.08.2016   
30.08.2016  3   3     01.09.2016  
31.05.2016  3   1     31.05.2016 
31.05.2016  3   2     01.06.2016 
31.05.2016  3   3     02.06.2016 
... 

同時に私は週末をスキップする必要があります!

Pandasは、列 "Date"の値をnull以外のオブジェクトとして認識します。これは彼が日付としてそれらを見ていないことを意味しますか?

誰かが私を助けることができますか?私はこの仕事を自分では扱うことができません。

+1

完全に不明です。 –

+0

デフォルトでは間違っていないと、pandasは日付を文字列として認識しますので、[pandas.to_datetime](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.to_datetime.html)を使用して変換してください'Date'カラムからdatetime値へ –

答えて

2

IIUC:

from pandas.tseries.offsets import BDay 
df['Date'] = pd.to_datetime(df.Date) 
df.assign(Distribution_of_days=df['Date'] + df['Day_number'].apply(BDay)) 

出力:

  Date Timing Day_number Distribution_of_days 
0 2016-03-17  8   1   2016-03-18 
1 2016-03-17  8   2   2016-03-21 
2 2016-03-17  8   3   2016-03-22 
3 2016-03-17  8   4   2016-03-23 
4 2016-03-17  8   5   2016-03-24 
5 2016-03-17  8   6   2016-03-25 
6 2016-03-17  8   7   2016-03-28 
7 2016-03-17  8   8   2016-03-29 
8 2016-08-30  3   1   2016-08-31 
9 2016-08-30  3   2   2016-09-01 
10 2016-08-30  3   3   2016-09-02 
11 2016-05-31  3   1   2016-06-01 
12 2016-05-31  3   2   2016-06-02 
13 2016-05-31  3   3   2016-06-03 

EDIT(彼は、現在の日に作業を開始します):

df.assign(Distribution_of_days=df['Date'] + df['Day_number'].add(-1).apply(BDay)) 

出力:

  Date Timing Day_number Distribution_of_days 
0 2016-03-17  8   1   2016-03-17 
1 2016-03-17  8   2   2016-03-18 
2 2016-03-17  8   3   2016-03-21 
3 2016-03-17  8   4   2016-03-22 
4 2016-03-17  8   5   2016-03-23 
5 2016-03-17  8   6   2016-03-24 
6 2016-03-17  8   7   2016-03-25 
7 2016-03-17  8   8   2016-03-28 
8 2016-08-30  3   1   2016-08-30 
9 2016-08-30  3   2   2016-08-31 
10 2016-08-30  3   3   2016-09-01 
11 2016-05-31  3   1   2016-05-31 
12 2016-05-31  3   2   2016-06-01 
13 2016-05-31  3   3   2016-06-02 
+0

これはどうやって正しいですか?二番目の日付は '2016-03-21'ですか? – zipa

+0

2016年3月17日は木曜日、土曜日は2日間です。翌営業日は2016年3月21日(月)です。 –

+0

あなたは正しいです、希望の出力は誤解を招くものでした。 – zipa

2

これは動作します:

import pandas as pd 

#this is just creation of your dataframe 
data = '17.03.2016,8,1,17.03.2016,8,2,17.03.2016,8,3,17.03.2016,8,4,17.03.2016,8,5,17.03.2016,8,6,17.03.2016,8,7,17.03.2016,8,8,30.08.2016,3,1,30.08.2016,3,2,30.08.2016,3,3,31.05.2016,3,1,31.05.2016,3,2,31.05.2016,3,3' 
data = data.split(',') 
date = data[::3] 
timing = [int(i) for i in data[1::3]] 
day_number = [int(j) for j in data[2::3]] 


#here is actual code 
df = pd.DataFrame({'Date': date, 'Timing': timing, 'Day_number': day_number}) 
df['Date'] = pd.to_datetime(df['Date']) 

df['Distribution_of_days'] = df.Date + pd.to_timedelta(df.Day_number-1, unit='D') 
関連する問題