我有一个很大的数据集,我从CSV读取到具有1s频率日期时间索引的数据帧。加载时df约为2.5gb。大多数数据存储为np.float32。在获取源数据的过程中,有时会在16hz处对它进行采样,但是CSV被索引为1秒的行,因此突发数组数据以CH [0],CH [1] ... CH [15]的形式存储沿着第二排。因此,CH0表示时间为零,CH1表示时间+ 0.0625s,以此类推。我想对这些数据进行清理,以便每个亚秒测量都有一个新行。因此,基本上该测量的所有数据都位于同一列中的16行中,而不是1行中的16列中。数据集中有数百个这样的突发通道,但是突发期间的数据简化版本(为简单起见更改为4hz)如下所示。突发采集结束后,数据返回到NaN:
我不知道从哪里开始:(
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateEducationQualificationsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('education_qualifications', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('teacher_id')->nullable();
$table->unsignedInteger('student_id')->nullable();
$table->string('institute_name');
$table->string('user_degree');
$table->string('field_of_study');
$table->string('user_grade');
$table->date('from_date')->nullable();
$table->date('to_date')->nullable();
$table->text('edu_description');
$table->timestamps();
$table->foreign('teacher_id')->references('id')->on('teachers')->onUpdate('cascade')->onDelete('cascade');
$table->foreign('student_id')->references('id')->on('users')->onUpdate('cascade')->onDelete('cascade');
$table->primary(['teacher_id', 'student_id']);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('education_qualifications');
}
}
我希望数据看起来像这样(显示前2秒):
CH0 CH1 CH2 CH3
TIME
2019-02-09 12:53:06 29 12 43 10
2019-02-09 12:53:07 56 15 77 88
2019-02-09 12:53:08 82 9 95 19
2019-02-09 12:53:09 13 13 79 1
2019-02-09 12:53:10 35 87 77 37
2019-02-09 12:53:11 53 9 5 9
2019-02-09 12:53:12 25 63 78 70
2019-02-09 12:53:13 23 62 41 22
2019-02-09 12:53:14 21 52 10 82
将数据复制到新列(例如df ['CH'])还是重用CH0都没有关系。然后,我将删除CH1等列。
编辑:
我尝试了提供的答案,但是当“ TIME”已定义为我的索引时遇到了麻烦。我在第20行df1 ['TIME'] = df ['TIME']遇到关键错误,我得到这个假设我认为TIME不再作为一列存在,所以我尝试了:
CH0 CH1 CH2 CH3
TIME
2019-02-09 12:53:06.00 29 Nan Nan Nan
2019-02-09 12:53:06.25 12 Nan Nan Nan
2019-02-09 12:53:06.50 43 Nan Nan Nan
2019-02-09 12:53:06.75 10 Nan Nan Nan
2019-02-09 12:53:07.00 56 Nan Nan Nan
2019-02-09 12:53:07.25 15 Nan Nan Nan
2019-02-09 12:53:07.50 77 Nan Nan Nan
2019-02-09 12:53:07.75 88 Nan Nan Nan
2019-02-09 12:53:08.00 82 Nan Nan Nan
那没有用。有人可以根据日期时间已经存在的索引建议对代码进行更改。我当前的完整代码(包括我如何生成概念证明数据)如下所示:
df1.index = df.index
答案 0 :(得分:0)
您可以添加毫秒数并连接数据:
// Set the given text.
void QsciScintilla::setText(const QString &text)
{
bool ro = ensureRW();
SendScintilla(SCI_SETTEXT, ScintillaBytesConstData(textAsBytes(text)));
SendScintilla(SCI_EMPTYUNDOBUFFER);
setReadOnly(ro);
}
如果您的列已经是日期时间,则可以省略pd.to_datetime。
请记住要sci.SendScintilla(sci.SCI_SETTEXT, b"some text")
。
在concat中,您可以使用df1 = pd.DataFrame()
df1['time'] = pd.to_datetime(df['time'])
df1['CH0'] = df['CH0']
df2 = pd.DataFrame()
df2['time'] = pd.to_datetime(df['time'] + datetime.timedelta(milliseconds=250))
df2['CH0'] = df['CH1']
df3 = pd.DataFrame()
df3['time'] = pd.to_datetime(df['time'] + datetime.timedelta(milliseconds=500))
df3['CH0'] = df['CH2']
df4 = pd.DataFrame()
df4['time'] = pd.to_datetime(df['time'] + datetime.timedelta(milliseconds=750))
df4['CH0'] = df['CH3']
result = pd.concat([df1, df2, df3, df4])
result.sort('time')
。
但我认为第一次设定时间索引会更快。
如果您想让它更干,可能可以使用该代码循环甚至制作lambda。