2016-11-03 3 views
0

時間の日時表現と可変列を含むtimeという名前の列を持つ2つのデータフレームがあります。私はこれらの2つのデータフレームをマージしたいが、何らかの理由でこれがnnという日時フォーマットを混乱させる。Pandas DataFrameをマージした後にDateTime形式が変更される

私は、個々のデータフレームを作成するには、このコードを使用し、次のよう

## ECG load 
nn = pd.read_csv('D:\\path\\Nn.csv',delimiter=";",decimal=',',header=None,names=["time","ibi"]) 
fsEcg = 1024 # Sample frequency 
tsEcg = mkdatMovis('2016-10-31T12:16:15.015') #datetime rep of Start time string 
nn.loc[:,'time'] = nn.time/fsEcg # convert sample number to seconds 
ecgTime = zip(tsEcg + datetime.timedelta(seconds=float(cmt)) for cmt in nn.time) 
nn.loc[:,'time'] = ecgTime 

## EDA load 
eda = pd.read_csv('D:\\path\\eda.csv',\ 
        delimiter=";",decimal=',',header=None,names=["eda"]) 
fsEda = 32 
tsEda = mkdatMovis('2016-10-31T12:17:08.363') 
cumEda = np.arange(len(eda),dtype=np.float64)/fsEda # create time array in seconds 
cumEda = pd.Series(cumEda) 
edadat = pd.DataFrame() 
edadat.loc[:,'time'] = zip(tsEda + datetime.timedelta(seconds=float(cmt)) for cmt in cumEda) 
edadat.loc[:,'eda'] = eda 

データフレームは、次のとおりです。

>>> nn 
          time   nn 
0 2016-10-31 12:16:26.409531 972.656250 
1 2016-10-31 12:16:27.394883 985.351562 
2 2016-10-31 12:16:28.379258 984.375000 
3 2016-10-31 12:16:29.360703 981.445312 
4 2016-10-31 12:16:30.407578 1046.875000 
... 
1448 2016-10-31 12:39:37.910508 845.703125 

>>> edadat 
           time eda 
0  (2016-10-31 12:17:08.363000,) 2.0 
1  (2016-10-31 12:17:08.363000,) 5.0 
2  (2016-10-31 12:17:08.363000,) 5.0 
3  (2016-10-31 12:17:08.363000,) 4.0 
4  (2016-10-31 12:17:08.363000,) 4.0 
.... 
41582 (2016-10-31 12:38:47.363000,) 36.0 

df = edadat.merge(nn,on="time",how="outer")でデータフレームをマージした後、データは次のようになります

       time eda   nn 
0  (2016-10-31 12:17:08.363000,) 2.0   NaN 
1  (2016-10-31 12:17:08.363000,) 5.0   NaN 
2  (2016-10-31 12:17:08.363000,) 5.0   NaN 
3  (2016-10-31 12:17:08.363000,) 4.0   NaN 
4  (2016-10-31 12:17:08.363000,) 4.0   NaN 
... 
43027   1477917574356797000 NaN 928.710938 
43028   1477917575276719000 NaN 919.921875 
43029   1477917576178086000 NaN 901.367188 
43030   1477917577064805000 NaN 886.718750 
43031   1477917577910508000 NaN 845.703125 

なぜdatetimeマージした後にnnをunixに変換しましたか?タイムシリーズを作成するのにまったく同じコードを使用しないでください。

答えて

1

私はあなたがstr[0]でタプルを削除する必要があるので、あなたは、列timetuplesを持っている問題があると思います - DataFrameの行の各タプルの最初の要素を選択します。

edadat.time = edadat.time.str[0] 
print (edadat) 
          time eda 
0  2016-10-31 12:17:08.363000 2.0 
1  2016-10-31 12:17:08.363000 5.0 
2  2016-10-31 12:17:08.363000 5.0 
3  2016-10-31 12:17:08.363000 4.0 
4  2016-10-31 12:17:08.363000 4.0 
41582 2016-10-31 12:38:47.363000 36.0 

次に使用:

df = edadat.merge(nn,on="time",how="outer") 
print (df) 
         time eda   nn 
0 2016-10-31 12:17:08.363000 2.0   NaN 
1 2016-10-31 12:17:08.363000 5.0   NaN 
2 2016-10-31 12:17:08.363000 5.0   NaN 
3 2016-10-31 12:17:08.363000 4.0   NaN 
4 2016-10-31 12:17:08.363000 4.0   NaN 
5 2016-10-31 12:38:47.363000 36.0   NaN 
6 2016-10-31 12:16:26.409531 NaN 972.656250 
7 2016-10-31 12:16:27.394883 NaN 985.351562 
8 2016-10-31 12:16:28.379258 NaN 984.375000 
9 2016-10-31 12:16:29.360703 NaN 981.445312 
10 2016-10-31 12:16:30.407578 NaN 1046.875000 
11 2016-10-31 12:39:37.910508 NaN 845.703125 

でも良いと思います。merge_ordered

df1 = pd.merge_ordered(edadat, nn,on="time",how="outer") 
print (df1) 
         time eda   nn 
0 2016-10-31 12:16:26.409531 NaN 972.656250 
1 2016-10-31 12:16:27.394883 NaN 985.351562 
2 2016-10-31 12:16:28.379258 NaN 984.375000 
3 2016-10-31 12:16:29.360703 NaN 981.445312 
4 2016-10-31 12:16:30.407578 NaN 1046.875000 
5 2016-10-31 12:17:08.363000 2.0   NaN 
6 2016-10-31 12:17:08.363000 5.0   NaN 
7 2016-10-31 12:17:08.363000 5.0   NaN 
8 2016-10-31 12:17:08.363000 4.0   NaN 
9 2016-10-31 12:17:08.363000 4.0   NaN 
10 2016-10-31 12:38:47.363000 36.0   NaN 
11 2016-10-31 12:39:37.910508 NaN 845.703125 
+0

ありがとう。実際にはうまくいくように思えます(ただし、私は今いくつかの変更を加えなければなりません)。しかし、なぜnnの時間インデックスはタプルではなかったのですか?そして、なぜedadatのタプルが 'nn'時間指数を変えたのですか?それはタイプ変換と関係がありますか?最後の質問では、 'df.time = x'は' df.loc [:、 "time"] = time'に置き換えられるべきだと思いました。それは今どのように正しいですか? –

+0

少なくとも1つの行が2つの要素を持つタプルを返すので、 'time'カラムの' edadat'にはタプルが問題であると思います。 – jezrael

+0

これは 'print(edadat [edadat.time.str.len()> 1])' – jezrael

関連する問題