2016-10-27 45 views
0

我是熊貓新手,並且對此有問題。我有一個簡單的表:將熊貓數據框中的日期時間添加到基於列的現有行

  date period_number 
0 2016-10-26    1 
1 2016-10-26    3 
2 2016-10-26    5 
3 2016-10-27    1 

我想創建一個開始和結束時間3大小相等的週期,就像這樣:

  date period_number    start    end         
0 2016-10-26    1 2016-10-26 00:00 2016-10-26 08:00 
1 2016-10-26    3 2016-10-26 08:00 2016-10-26 16:00  
2 2016-10-26    5 2016-10-26 16:00 2016-10-27 00:00      
3 2016-10-27    1 2016-10-27 00:00 2016-10-27 08:00   

我試圖做這樣的事情:

for (period, group) in df.groupby('period'): 
    if period == 1: 
     group['start'] = group['date'] 
     group['end'] = group['date'] + timedelta(hours=8) 
    if period == 3: 
     group['start'] = group['date'] + timedelta(hours=8) 
     group['end'] = group['date'] + timedelta(hours=16) 
    if period == 5: 
     group['start'] = group['date'] + timedelta(hours=16) 
     group['end'] = group['date'] + timedelta(days=1) 

但我收到錯誤:

A value is trying to be set on a copy of a slice from a DataFrame. 
Try using .loc[row_indexer,col_indexer] = value instead 

也試過,但顯然是錯誤的,並得到同樣的錯誤:

df[df['period'] == 1]['end'] = df['date'] + timedelta(hours=8) 

回答

0

我的方法是使用一個應用,看起來在週期整數,並使用該可變數量的小時添加到日期。這有點不好意思,但有訣竅。 這將是清潔的,如果期號碼將只爲1 2 3

# Initialise dataframe 
df = pd.DataFrame([['2016-10-26', '2016-10-26', '2016-10-26', '2016-10-27'], [1, 3, 5, 1]]).T 
df.columns = ['date', 'period_number'] 
df['date'] = df['date'].apply(pd.to_datetime) 

# Make start column 
df['start'] = df.apply(lambda x: x.date + timedelta(hours=8 * (x.period_number - 1)/2), 1) 

# End column is just start column + 8 hours 
df['end'] = df.start + timedelta(hours=8) 

這將返回:

date period_number start end 
0 2016-10-26 1 2016-10-26 00:00:00 2016-10-26 08:00:00 
1 2016-10-26 3 2016-10-26 08:00:00 2016-10-26 16:00:00 
2 2016-10-26 5 2016-10-26 16:00:00 2016-10-27 00:00:00 
3 2016-10-27 1 2016-10-27 00:00:00 2016-10-27 08:00:00 
+0

謝謝,我也意識到,數據始終是爲了讓我能其實只是創建帶freq ='8H'的date_range並將其添加到數據框 – eggbert

+0

使事情變得更容易;) – Skirrebattie

相關問題