合并并绘制多个熊猫数据框

时间:2020-04-28 05:14:23

标签: python pandas

希望获得帮助以完成以下任务:

摘要

  1. 重新索引数据框
  2. 合并多个数据框
  3. 根据时间列绘制新数据框

更多详细信息

我有一个数据集(raw_data),如下所示:

id  timestamp       key             value
1   1576086899000   temperature     70
2   1576086899000   sleep           8
3   1576086899000   heartrate       65
4   1576086876000   temperature     72
5   1576086876000   sleep           7.5
6   1576086876000   heartrate       62
7   1576086866000   temperature     74
8   1576086866000   sleep           7.8
9   1576086866000   heartrate       64

我使用以下方法对其进行了旋转:

df = rawdata.pivot(index='timestamp', columns='key', values='value')

这使索引成为一个时间戳记值,并且每一列都是一个与之对应的键名。

因为每行并不总是包含每个键/值对的值,所以我为特定键创建了一个新的数据框,并删除了所有NaN值:

sleep_df = pd.DataFrame({'date': df.index, 'value': df.sleep}).dropna()

这仍将索引保留为列时间戳,但创建了一个重复的列,称为时间。然后,我将时间列的格式设置为年,月,日的值:

sleep_df['date]' = pd.to_datetime(sleep_df['date'], unit='ms').map(lambda x: x.strftime('%Y-%m-%d'))

因此,我为这些表中的每一个生成的数据集如下所示:

timestamp       date         sleep            
1576086899000   2020-04-05      8
1576086876000   2020-04-04     7.5
1576086866000   2020-04-03     7.8

我的最终目标是:

  1. 合并这些表中的每个表,并将它们与时间列相对应。我认为,由于这个原因,索引应该保留timestamp,因为它可以合并记录数据的时间戳相同的值。
  2. 在以后的分析中,我很想确定是否可以基于日期而不是基于时间戳合并数据,因为某些数据可能没有在准确的时间记录。我是否必须建立索引:“日期”?我认为我必须确保每个日期只有一个条目,否则合并表可能会变得很时髦。
  3. 思考我弄清楚了这些数据的绘图。我将表的索引设置为date字段,并将所有值都转换为类型int并针对日期进行了绘制。有更好的方法吗?

感谢您预先提供的帮助,SO一直以来都是很好的学习工具。

1 个答案:

答案 0 :(得分:0)

如果您的目标是绘制每个键的时间序列,则建议不要旋转,分离数据框并重新合并它们。我建议直接使用初始DataFrame,因为您可以绘制一个图,其中每条线代表一个特定的键,例如使用public class BrowsingTestFragment extends Fragment { View rootView; WebView myWebView; Button start; boolean startTesting; String[] mStrings; private int i = 0; long last_page_start; long now; long exactTime; TextView time1, time2, time3, time4, time5,weight1; Handler handler; Runnable webUpdater = null; BrowsingTestFragment context; public BrowsingTestFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { rootView = inflater.inflate(R.layout.fragment_browsingtest, container, false); myWebView = new WebView(getContext()); myWebView = rootView.findViewById(R.id.webview); mStrings = new String[]{ "https://www.google.com", "https://www.facebook.com", "https://www.twitter.com", "https://www.wikipedia.org", "https://www.linkedin.com" }; time1 = rootView.findViewById(R.id.textView); time2 = rootView.findViewById(R.id.textView5); time3 = rootView.findViewById(R.id.textView8); time4 = rootView.findViewById(R.id.textView11); time5 = rootView.findViewById(R.id.textView14); weight1=rootView.findViewById(R.id.textView4); start = rootView.findViewById(R.id.button); startTesting = false; myWebView.clearCache(true); myWebView.clearHistory(); myWebView.setVisibility(View.INVISIBLE); start.setVisibility(View.VISIBLE); myWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); myWebView.getSettings().setSaveFormData(false); start.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { time1.setText(R.string.defaultString); time2.setText(R.string.defaultString); time3.setText(R.string.defaultString); time4.setText(R.string.defaultString); time5.setText(R.string.defaultString); last_page_start = now = exactTime = 0; myWebView.clearCache(true); myWebView.clearHistory(); myWebView.getSettings().setJavaScriptEnabled(true); myWebView.setHorizontalScrollBarEnabled(false); myWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); myWebView.getSettings().setSaveFormData(false); myWebView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return true; } }); if (!startTesting) { i = 0; startTesting = true; myWebView.setVisibility(View.VISIBLE); start.setVisibility(View.INVISIBLE); startLoadURLs(); } else { startTesting = false; myWebView.setVisibility(View.INVISIBLE); start.setVisibility(View.VISIBLE); } } }); myWebView.setWebChromeClient(new MyWebChromeClient(this)); myWebView.setWebViewClient(new WebViewClient() { boolean redirect = false; @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); Log.i("onPageStartedurl", "onPageStarted last_page_start" + last_page_start); if (redirect == false) last_page_start = System.nanoTime(); Log.i("onPageStartedurl", "onPageStarted last_page_start" + last_page_start); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); now = System.nanoTime(); Log.i("onPageFinishedurl", "onPageFinished now" + now); } @Override public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { super.onReceivedError(view, request, error); Log.i("onReceivedErrorurl", "onReceivedError"); now = last_page_start; } }); return rootView; } private void startLoadURLs() { MainActivity.mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); myWebView.loadUrl(mStrings[i]); Log.i("mStringsurl", "mStrings" + mStrings[i]); handler = new Handler(); webUpdater = new Runnable() { @Override public void run() { exactTime = now - last_page_start; Log.i("exactTimeurl", "exactTime" + exactTime); double elapsedTimeInSecond = Math.round(((double) exactTime / 1000000000) * 100.0) / 100.0; Log.i("elapsedTimeInSecondurl", "elapsedTimeInSecond" + elapsedTimeInSecond); if (i == 0) { time1.setText("" + elapsedTimeInSecond + " s"); } else if (i == 1) { time2.setText("" + elapsedTimeInSecond + " s"); } else if (i == 2) { time3.setText("" + elapsedTimeInSecond + " s"); } else if (i == 3) { time4.setText("" + elapsedTimeInSecond + " s"); } else if (i == 4) { time5.setText("" + elapsedTimeInSecond + " s"); } ++i; if (i < mStrings.length) { myWebView.clearCache(true); myWebView.clearHistory(); myWebView.clearFormData(); myWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); myWebView.getSettings().setSaveFormData(false); startLoadURLs(); } else { handler.removeCallbacks(webUpdater); startTesting = false; myWebView.clearCache(true); myWebView.clearHistory(); myWebView.clearFormData(); myWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); myWebView.getSettings().setSaveFormData(false); myWebView.setVisibility(View.INVISIBLE); start.setVisibility(View.VISIBLE); MainActivity.mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); } } }; handler.postDelayed(webUpdater, 5000); // 5 seconds } private class MyWebChromeClient extends WebChromeClient { public MyWebChromeClient(BrowsingTestFragment browsingTestFragment) { super(); context = browsingTestFragment; } } @Override public void onStop() { super.onStop(); try { if (startTesting) { handler.removeCallbacks(webUpdater); startTesting = false; myWebView.clearCache(true); myWebView.clearHistory(); myWebView.clearFormData(); myWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); myWebView.getSettings().setSaveFormData(false); myWebView.setVisibility(View.INVISIBLE); start.setVisibility(View.VISIBLE); MainActivity.mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); Toast.makeText(getContext(), "Testting is terminatted", Toast.LENGTH_SHORT).show(); } } catch (Exception e) { e.printStackTrace(); } } }

seaborn

不必通过import pandas as pd import seaborn as sns df = pd.DataFrame({"timestamp": pd.date_range("2020-04-20 00:00:00", periods=8, freq="D"), "key": ["temperature", "sleep", "heartrate", "temperature", "sleep", "heartrate", "temperature", "sleep"], "value": [70, 8, 65, 72, 7.5, 62, 74, 7.8]}) df["date"] = pd.to_datetime(df["timestamp"]) g = sns.relplot(x="date", y="value", hue="key", kind="line", data=df) g.fig.autofmt_xdate() 进行索引。 希望对您有所帮助。