2017-05-24 11 views
0

の文字列タイムスタンプでデータフレームをマージする方法を私はマージしたいさまざまなソースからの2つのCSVデータファイルを持っています。両方のファイルには、各行の文字列タイムスタンプがありますが、非常に異なる期間があります.1つは2秒ごと、もう1つは毎時間です。私はそれらをPandasにインポートし、それらをマージしようとしましたが、2つの問題があります。異なる周波数

1)私はpd.to_datetimeを使用してオブジェクトdatetime64パンダにタイムスタンプを変換することができますが、これはデータ列を失って、新しいシリーズを作成します。変換は「インプレース」で行うことができますか? は私の試みがある: newdf = pd.to_datetime(calc_insol.ilocの[:0])#1 calc_insolがDF

2)私が正しい日時形式に両方のDFを得ることができると仮定すると、それらが所定のマージすることができますタイムスタンプ期間の非常に大きな違い。

各DFの抽出物は、以下に示されています。

0 2017-May-19 2:00:00 0 
1 2017-May-19 3:00:00 0 
2 2017-May-19 4:00:00 0 
3 2017-May-19 5:00:00 0 
4 2017-May-19 6:00:00 0 
5 2017-May-19 7:00:00 0 
6 2017-May-19 8:00:00 497.5 
7 2017-May-19 9:00:00 685.2 
8 2017-May-19 10:00:00 768.4 
9 2017-May-19 11:00:00 806.3 
10 2017-May-19 12:00:00 816.6 
11 2017-May-19 13:00:00 803.1 
12 2017-May-19 14:00:00 760.6 
13 2017-May-19 15:00:00 668.7 
14 2017-May-19 16:00:00 456.8 
15 2017-May-19 17:00:00 0 
16 2017-May-19 18:00:00 0 
17 2017-May-19 19:00:00 0 
18 2017-May-19 20:00:00 0 
19 2017-May-19 21:00:00 0 
20 2017-May-19 22:00:00 0 
21 2017-May-19 23:00:00 0 
22 2017-May-20 0 

meas_insol:

2017-May-19 11:59:57 89.8 
2017-May-19 11:59:59 80.57 
2017-May-19 12:00:01 90.64 
2017-May-19 12:00:03 93.15001 
2017-May-19 12:00:05 85.6 
2017-May-19 12:00:07 78.89 
2017-May-19 12:00:09 85.6 
2017-May-19 12:00:11 75.53 
2017-May-19 12:00:13 93.99 
2017-May-19 12:00:15 93.15001 
2017-May-19 12:00:17 92.32 
2017-May-19 12:00:19 87.28 
2017-May-19 12:00:21 77.21 
2017-May-19 12:00:23 92.32 
2017-May-19 12:00:25 79.73001 
2017-May-19 12:00:27 76.37001 
2017-May-19 12:00:30 74.69 
2017-May-19 12:00:32 88.96 
2017-May-19 12:00:34 73.85 
2017-May-19 12:00:36 78.89 
2017-May-19 12:00:38 76.37001 
2017-May-19 12:00:40 77.21 
2017-May-19 12:00:42 88.12 
2017-May-19 12:00:44 87.28 
2017-May-19 12:00:46 88.12 
2017-May-19 12:00:48 79.73001 
2017-May-19 12:00:50 74.69 
2017-May-19 12:00:52 77.21 
2017-May-19 12:00:54 83.92 
2017-May-19 12:00:56 73.85 
2017-May-19 12:00:58 83.92 
2017-May-19 12:01:00 83.08001 
2017-May-19 12:01:02 74.69 
2017-May-19 12:01:04 78.89 
2017-May-19 12:01:06 73.85 
2017-May-19 12:01:08 86.44 
2017-May-19 12:01:10 74.69 
2017-May-19 12:01:12 73.01 
2017-May-19 12:01:14 68.82 
2017-May-19 12:01:16 83.92 

理想的には、完成DFがdatetimeオブジェクトとCOL 1意志としてCOL 0を持つことになり、文字列のタイムスタンプがCOL 0で、 "データ" COL 1 calc_insolでありますcalc_insolからのデータであり、col 2はmeas_insolからのデータです。 ご協力いただければ幸いです。

+0

を私の答えは何の所望の出力を持っていない場合、あなたはそれを追加することができます質問?また、日付の間に一致がない、あなたはそれを変更できますか? (サンプルで3〜5行はOKです)。ありがとうございました。 – jezrael

+0

ありがとうございます - データ選択が重複するように変更しました。あなたの提案を使用して、各ファイルでタイムスタンプを修正しました。私は今合併を確認することはできませんが、明日はオフィスに戻るときになります。 – icenov

+0

申し訳ありませんが、今私は少し混乱しています - あなたはcalc_insol' 'のようなhours''へ 'meas_insol'アップサンプリングを最初に必要として、マージしていますか? – jezrael

答えて

0

私はあなたがdropnew列を新しいdatetime列を作成し、それらをマージし、最後の削除が必要だと思う - 元の列は変更されません。

calc_insol['new'] = pd.to_datetime(calc_insol.iloc[:,0]) 
meas_insol['new'] = pd.to_datetime(meas_insol.iloc[:,1]) 
df = pd.merge(calc_insol, meas_insol, on='new') 
#if necessary 
df = df.drop('new',axis=1) 
+0

ありがとうございます。これが機能しました。関連するcalc_incolデータがない場合でも、すべてのmeas_insolタイムスタンプを保持すると便利です。たぶんon = 'new'なしで? – icenov

+0

Hmmm、how = 'left''n'または 'how = 'right'' ;;) – jezrael

+0

はい - これはうまくいきました:df_merged = pd.merge(calc_insol、meas_insol、how =' left '、on =' new ')これはすべてのデータを含むdfを生成しました - 毎時のタイムスタンプ(つまりhh:00:00)はmeasとcalcの両方を持ち、measはすべてのタイムスタンプの値を持っています。ありがとう! – icenov