2017-04-26 36 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,那麼我會查看日期並在此行的每行中添加一天。結果是八行,日期從2016年3月17日至2016年3月24日。 「Timing」列中的值可能不同。日期也不同。對於這個例子,我應該有這樣的事情:

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」的值識別爲非空對象。這是否意味着他沒有看到他們的日期?

有人可以幫助我嗎?我自己無法處理這個任務。

+1

完全不清楚。 –

+0

默認情況下,如果我沒有錯,熊貓認爲日期是字符串,所以你最好使用[pandas.to_datetime](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.to_datetime.html)來轉換日期時間值的「日期」列 –

回答

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日是星期四和星期六的兩天。下一個工作日是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')