最近帮朋友处理气温数据,在结束之后想想可以整理整理,希望对需要的人有帮助。本人选择使用c#在vs10下,对txt格式的近30多年的日气温数据进行读取,并存储在本地数据库中。由于本人的数据库水平比较有限,本人尽量避免了使用复杂的sql语言,使用到的都是基本的选择语句。在此基础上,对本地数据库进行访问读取,使用datatable(这种方式比较耗内存,因为把简单处理后表都存在了内存中)对数据进行处理可以得出阀值、以及站点的其他数据,并存为临时数据,此次最终需要的是大于阀值连续日数统计,所以在datatable下对 按照阀值筛选后的数据进行日前排序,得到新表,在此基础上只要运用算法对其进行统计即可。如下是部分统计数据的代码。
string consqlserver = "Data Source=.;Initial Catalog=xiyuanTabels;Integrated Security=True;";
SqlConnection objConnection = new SqlConnection(consqlserver);
string sql = "select * from xiyuanTabels.dbo.T_table where T_table.区站号 = " + cur[i] + "order by T_table.日最高气温 ";
SqlDataAdapter sda = new SqlDataAdapter(sql, objConnection);
DataSet ds = new DataSet();
sda.Fill(ds, "user");
DataTable dt = ds.Tables[0];
int num = Convert.ToInt32(Convert.ToSingle(dt.Rows.Count) * 0.95f); // 所有逐日气温数据排序确定其95百分位,可以确定阀值哦~
pdatatable.Rows.Clear();
for (int iv = num; iv < dt.Rows.Count; iv++)
{
DataRow m_pDataRow = pdatatable.NewRow();
m_pDataRow["区站号"] = dt.Rows[iv]["区站号"];
m_pDataRow["纬度"] = dt.Rows[iv]["纬度"];
m_pDataRow["经度"] = dt.Rows[iv]["经度"];
m_pDataRow["观测场拔海高度"] = dt.Rows[iv]["观测场拔海高度"];
m_pDataRow["日期"] = Convert.ToDateTime(dt.Rows[iv]["日期"].ToString()).ToString("yyyyMMdd"); ;
m_pDataRow["平均气温"] = dt.Rows[iv]["平均气温"];
m_pDataRow["日最高气温"] = dt.Rows[iv]["日最高气温"];
m_pDataRow["日最低气温"] = dt.Rows[iv]["日最低气温"];
pdatatable.Rows.Add(m_pDataRow);
}
dtCopy = pdatatable.Copy();
DataView dv = pdatatable.DefaultView;//利用datatable按日期排序
dv.Sort = "日期";
dtCopy = dv.ToTable();
int k = 0;
for (int samei = 1; samei < dtCopy.Rows.Count - 1; samei++)
{
DateTime d1 = DateTime.ParseExact(dtCopy.Rows[samei]["日期"].ToString(), "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture);
DateTime d2 = DateTime.ParseExact(dtCopy.Rows[samei+1]["日期"].ToString(), "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture);
//求两个时间差
TimeSpan ND = d2 - d1;
//求两个时间的分钟差
int Aday = ND.Days;
if (Aday == 1)
{
k++;
}
else
{
if (k >= 2)//连续日数(可进行调节)控制你需要连续几日的数据 此处的2表示连续3天及以上的日期
{
DataRow m_pDataRow = pdatatableend.NewRow(); //下面是获取该站点的基本数据 和最后日期
m_pDataRow["区站号"] = dtCopy.Rows[samei - 1]["区站号"];
m_pDataRow["纬度"] = dtCopy.Rows[samei - 1]["纬度"];
m_pDataRow["经度"] = dtCopy.Rows[samei - 1]["经度"];
m_pDataRow["观测场拔海高度"] = dtCopy.Rows[samei - 1]["观测场拔海高度"];
m_pDataRow["日期"] = d1;
m_pDataRow["平均气温"] = dtCopy.Rows[samei - 1]["平均气温"];
m_pDataRow["日最高气温"] = dtCopy.Rows[samei - 1]["日最高气温"];
m_pDataRow["日最低气温"] = dtCopy.Rows[samei - 1]["日最低气温"];
m_pDataRow["出现次数"] = (k + 1).ToString();//连续日数的统计数据
pdatatableend.Rows.Add(m_pDataRow);
k = 0;
}
}
}
string consqlserver = "Data Source=.;Initial Catalog=xiyuanTabels;Integrated Security=True;";
SqlConnection objConnection = new SqlConnection(consqlserver);
string sql = "select * from xiyuanTabels.dbo.T_table where T_table.区站号 = " + cur[i] + "order by T_table.日最高气温 ";
SqlDataAdapter sda = new SqlDataAdapter(sql, objConnection);
DataSet ds = new DataSet();
sda.Fill(ds, "user");
DataTable dt = ds.Tables[0];
int num = Convert.ToInt32(Convert.ToSingle(dt.Rows.Count) * 0.95f); // 所有逐日气温数据排序确定其95百分位,可以确定阀值哦~
pdatatable.Rows.Clear();
for (int iv = num; iv < dt.Rows.Count; iv++)
{
DataRow m_pDataRow = pdatatable.NewRow();
m_pDataRow["区站号"] = dt.Rows[iv]["区站号"];
m_pDataRow["纬度"] = dt.Rows[iv]["纬度"];
m_pDataRow["经度"] = dt.Rows[iv]["经度"];
m_pDataRow["观测场拔海高度"] = dt.Rows[iv]["观测场拔海高度"];
m_pDataRow["日期"] = Convert.ToDateTime(dt.Rows[iv]["日期"].ToString()).ToString("yyyyMMdd"); ;
m_pDataRow["平均气温"] = dt.Rows[iv]["平均气温"];
m_pDataRow["日最高气温"] = dt.Rows[iv]["日最高气温"];
m_pDataRow["日最低气温"] = dt.Rows[iv]["日最低气温"];
pdatatable.Rows.Add(m_pDataRow);
}
dtCopy = pdatatable.Copy();
DataView dv = pdatatable.DefaultView;//利用datatable按日期排序
dv.Sort = "日期";
dtCopy = dv.ToTable();
int k = 0;
for (int samei = 1; samei < dtCopy.Rows.Count - 1; samei++)
{
DateTime d1 = DateTime.ParseExact(dtCopy.Rows[samei]["日期"].ToString(), "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture);
DateTime d2 = DateTime.ParseExact(dtCopy.Rows[samei+1]["日期"].ToString(), "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture);
//求两个时间差
TimeSpan ND = d2 - d1;
//求两个时间的分钟差
int Aday = ND.Days;
if (Aday == 1)
{
k++;
}
else
{
if (k >= 2)//连续日数(可进行调节)控制你需要连续几日的数据 此处的2表示连续3天及以上的日期
{
DataRow m_pDataRow = pdatatableend.NewRow(); //下面是获取该站点的基本数据 和最后日期
m_pDataRow["区站号"] = dtCopy.Rows[samei - 1]["区站号"];
m_pDataRow["纬度"] = dtCopy.Rows[samei - 1]["纬度"];
m_pDataRow["经度"] = dtCopy.Rows[samei - 1]["经度"];
m_pDataRow["观测场拔海高度"] = dtCopy.Rows[samei - 1]["观测场拔海高度"];
m_pDataRow["日期"] = d1;
m_pDataRow["平均气温"] = dtCopy.Rows[samei - 1]["平均气温"];
m_pDataRow["日最高气温"] = dtCopy.Rows[samei - 1]["日最高气温"];
m_pDataRow["日最低气温"] = dtCopy.Rows[samei - 1]["日最低气温"];
m_pDataRow["出现次数"] = (k + 1).ToString();//连续日数的统计数据
pdatatableend.Rows.Add(m_pDataRow);
k = 0;
}
}
}