2016-10-27 14 views
0

私はパンダには新しく、これに問題があります。パンダデータフレームのdatetimeを列に基づいて既存の行に追加します

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) 

  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   

私はこのような何かをしようとした:私はこのように、開始時刻と終了時刻を持つ3つの等しい大きさの期間を作成したい

  date period_number 
0 2016-10-26    1 
1 2016-10-26    3 
2 2016-10-26    5 
3 2016-10-27    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

関連する問題