2016-08-31 3 views
1

誰かがこの問題で私を助けてくれるのだろうか:私は構造を持つはずのパンダのデータフレーム(テキストファイルから生成)これと同じ:パンダのフレームの列にある日を時間だけを含む文字列リストから設定する

import pandas as pd 

data = {'Objtype' : ['bias', 'bias', 'flat', 'flat', 'StdStar', 'flat', 'Arc', 'Target1', 'Arc', 'Flat', 'Flat', 'Flat', 'bias', 'bias'], 
     'UT'  : pd.date_range("23:00", "00:05", freq="5min").values, 
     'Position' : ['P0', 'P0', 'P0', 'P0', 'P1', 'P1','P1', 'P2','P2','P2', 'P0', 'P0', 'P0', 'P0']} 

df = pd.DataFrame(data=data) 

私はので、私はnumpyのdatetime64string形式からUT列を変更考慮して、観察の時間を割いて、いくつかの操作を行いたいと思います:

df['UT'] = pd.to_datetime(df['UT']) 

どの私に与えるこのようなものは:

ファースト)年/月/日は、現在の1つに割り当てられる:

Objtype Position     UT 
0  bias  P0 2016-08-31 23:45:00 
1  bias  P0 2016-08-31 23:50:00 
2  flat  P0 2016-08-31 23:55:00 
3  flat  P0 2016-08-31 00:00:00 
4 StdStar  P1 2016-08-31 00:05:00 
5  flat  P1 2016-08-31 00:10:00 
6  Arc  P1 2016-08-31 00:15:00 
7 Target1  P1 2016-08-31 00:20:00 

しかし、ここでは二つの問題があります。

秒)は、23:59 - > 00:00から変更されていません。むしろそれは後退してしまった。

最初のデータフレームインデックス行の真の日付を知っていて、すべてのエントリが順番に(そしてそれらは常に日の出から日の出に)移動することがわかっています。どのようにしてこれらの問題を修正できますか?

+0

あなたはフラットフィールディングあなた観測されているように見えます。クール。 a = pd.date_range('08/31/2016 23:45:00 '、periods = 72、freq =' 5min ') – Rohit

+0

コメントありがとうございます。実際に私はそうです;)https://www.youtube.com/watch?v=ZsQPx5ow1JY – Delosari

答えて

1

2行の間の時間デルタ見つけるには:各行が後方に行くための追加的な1日の持っているために

df.UT - df.UT.shift() < pd.Timedelta(0) 
Out[49]: 
0 False 
1 False 
2 False 
3  True 
4 False 
5 False 
6 False 
7 False 
Name: UT, dtype: bool 

df.UT - df.UT.shift() 
Out[48]: 
0     NaT 
1   00:05:00 
2   00:05:00 
3 -1 days +00:05:00 
4   00:05:00 
5   00:05:00 
6   00:05:00 
7   00:05:00 
Name: UT, dtype: timedelta64[ns] 

時間が逆方向になったときに検索するには

((df.UT - df.UT.shift() < pd.Timedelta(0))*pd.Timedelta(1, 'D')) 
Out[50]: 
0 0 days 
1 0 days 
2 0 days 
3 1 days 
4 0 days 
5 0 days 
6 0 days 
7 0 days 
Name: UT, dtype: timedelta64[ns] 

追加の日数をシリーズにブロードキャスト転送するには、cumsumパターンを使用してください:

((df.UT - df.UT.shift() < pd.Timedelta(0))*pd.Timedelta(1, 'D')).cumsum() 
Out[53]: 
0 0 days 
1 0 days 
2 0 days 
3 1 days 
4 1 days 
5 1 days 
6 1 days 
7 1 days 
Name: UT, dtype: timedelta64[ns] 

バックあなたの元UT列に、この補正ベクトルを追加します。

df.UT + ((df.UT - df.UT.shift() < pd.Timedelta(0))*pd.Timedelta(1, 'D')).cumsum() 
Out[51]: 
0 2016-08-31 23:45:00 
1 2016-08-31 23:50:00 
2 2016-08-31 23:55:00 
3 2016-09-01 00:00:00 
4 2016-09-01 00:05:00 
5 2016-09-01 00:10:00 
6 2016-09-01 00:15:00 
7 2016-09-01 00:20:00 
Name: UT, dtype: datetime64[ns] 
+0

うわー!この答えから学ぶことがたくさんあります。大変ありがとう@Boud – Delosari

関連する問題