pandas从excel读取数据数字类型过长出现科学计数法的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pandas从excel读取数据数字类型过长出现科学计数法的问题相关的知识,希望对你有一定的参考价值。

参考技术A 将excel表格数据合并后,发现常规的数字后面几位都变成0了

excel显示数字时,如果数字大于12位就会自动转化为科学计数法。如果数字大于15位,它不仅用于科学技术费表示,还会只保留高15位,其他位都变0。所以本场景就是因为超过15位了,导致读取有问题,需要将数字类型转换位文本类型(str类型)

读取的时候都改为文本类型,即str类型读取。这样不管是前面0开头还是数值型长度比较长,不会因为是数字类型而导致读取的时候不按常理出牌。

www.qmpython.com

java读取excel时间格式出现数字怎么处理

在Excel中的日期格式,比如2009-12-24将其转化为数字格式时变成了40171,在用java处理的时候,读取的也将是40171。如果使用POI处理Excel中的日期类型的单元格时,如果仅仅是判断它是否为日期类型的话,最终会以NUMERIC类型来处理。

正确的处理方法是先判断单元格的类型是否则NUMERIC类型,然后再判断单元格是否为日期格式,如果是的话,创建一个日期格式,再将单元格的内容以这个日期格式显示出来。如果单元格不是日期格式,那么则直接得到NUMERIC的值就行了。

具体代码如下:

主要是判断NUMERIC 的时候 同事判断下 单元格是不是日期格式 如果是 日期格式直接 转成日期格式字符串返回值就ok了。

if (0 == cell.getCellType())     //判断是否为日期类型   if(HSSFDateUtil.isCellDateFormatted(cell))   //用于转化为日期格式  Date d = cell.getDateCellValue();   DateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");   str[k] = formater.format(d);  else   // 用于格式化数字,只保留数字的整数部分   DecimalFormat df = new DecimalFormat("########");   str[k] = df.format(cell.getNumericCellValue());  

JSch连接SSH问题Exception:Algorithm negotiation fail

使用Jenkins配置完远程SSH服务器,发生无法连接问题,查看Log后找到:

[SSH] Exception:Algorithm negotiation fail
com.jcraft.jsch.JSchException: Algorithm negotiation fail
at com.jcraft.jsch.Session.receive_kexinit(Session.java:520)
at com.jcraft.jsch.Session.connect(Session.java:286)
at com.jcraft.jsch.Session.connect(Session.java:150)
at org.jvnet.hudson.plugins.SSHSite.createSession(SSHSite.java:141)
at org.jvnet.hudson.plugins.SSHSite.executeCommand(SSHSite.java:151)
at org.jvnet.hudson.plugins.SSHBuildWrapper.executePreBuildScript(SSHBuildWrapper.java:75)
at org.jvnet.hudson.plugins.SSHBuildWrapper.setUp(SSHBuildWrapper.java:59)
at hudson.model.Build$BuildExecution.doRun(Build.java:154)
at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:533)
at hudson.model.Run.execute(Run.java:1754)
at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
at hudson.model.ResourceController.execute(ResourceController.java:89)
at hudson.model.Executor.run(Executor.java:240)
Finished: FAILURE

原因分析:OpenSSH和 JSch支持的交换算法不同,需要一方打开另一方支持的交换算法。

OpenSSH enables only the following key exchange algorithms by default:
- curve25519-sha256@libssh.org
- ecdh-sha2-nistp256
- ecdh-sha2-nistp384
- ecdh-sha2-nistp521
- diffie-hellman-group-exchange-sha256
- diffie-hellman-group14-sha1

Where as JSch claims to support these algorithms for key exchange:
- diffie-hellman-group-exchange-sha1
- diffie-hellman-group1-sha1

解决办法:

在SSH的配置文件/etc/ssh/sshd_config增加以下两行,让SSH支持相应的算法和MACs。

KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1

MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-ripemd160-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,hmac-ripemd160,umac-128@openssh.com,hmac-md5,hmac-sha1,hmac-sha1-96,hmac-md5-96

完成后重启SSH即可解决问题。

参考技术A

正确的处理方法是先判断单元格的类型是否则NUMERIC类型,判断单元格是否为日期格式,如果是的话,创建一个日期格式,将单元格的内容以这个日期格式显示出来。如果单元格不是日期格式,那么则直接得到NUMERIC的值就行了。

在Excel中的日期格式,比如2009-12-24将其转化为数字格式时变成了40171,在用java处理的时候,读取的也将是40171。如果使用POI处理Excel中的日期类型的单元格时,如果仅仅是判断它是否为日期类型的话,最终会以NUMERIC类型来处理。

三维引用样式

如果要分析同一工作簿中多张工作表上的相同单元格或单元格区域中的数据,就要用到三维引用。三维引用包含单元格或区域引用,前面加上工作表名称的范围。Excel 使用存储在引用开始名和结束名之间的任何工作表。例如,=SUM(Sheet2:Sheet13!B5) 将计算包含在 B5 单元格内所有值的和,单元格取值范围是从工作表2 到工作表 13。

以上内容参考:百度百科-单元格

参考技术B java读取excel时间格式出现数字的处理方法:
Excel存储日期、时间均以数值类型进行存储,读取时POI先判断是是否是数值类型,再进行判断转化
1、数值格式(CELL_TYPE_NUMERIC):
1.纯数值格式:getNumericCellValue() 直接获取数据
2.日期格式:处理yyyy-MM-dd, d/m/yyyy h:mm, HH:mm 等不含文字的日期格式
1).判断是否是日期格式:HSSFDateUtil.isCellDateFormatted(cell)
2).判断是日期或者时间
cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("h:mm")
OR: cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("yyyy-MM-dd")
3.自定义日期格式:处理yyyy年m月d日,h时mm分,yyyy年m月等含文字的日期格式
判断cell.getCellStyle().getDataFormat()值,解析数值格式
yyyy年m月d日----->31
m月d日---->58
h时mm分--->32
举例说明:
private String parseExcel(Cell cell)
String result = new String();
switch (cell.getCellType())
case HSSFCell.CELL_TYPE_NUMERIC:// 数字类型
if (HSSFDateUtil.isCellDateFormatted(cell)) // 处理日期格式、时间格式
SimpleDateFormat sdf = null;
if (cell.getCellStyle().getDataFormat() == HSSFDataFormat
.getBuiltinFormat("h:mm"))
sdf = new SimpleDateFormat("HH:mm");
else // 日期
sdf = new SimpleDateFormat("yyyy-MM-dd");

Date date = cell.getDateCellValue();
result = sdf.format(date);
else if (cell.getCellStyle().getDataFormat() == 58)
// 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
double value = cell.getNumericCellValue();
Date date = org.apache.poi.ss.usermodel.DateUtil
.getJavaDate(value);
result = sdf.format(date);
else
double value = cell.getNumericCellValue();
CellStyle style = cell.getCellStyle();
DecimalFormat format = new DecimalFormat();
String temp = style.getDataFormatString();
// 单元格设置成常规
if (temp.equals("General"))
format.applyPattern("#");

result = format.format(value);

break;
case HSSFCell.CELL_TYPE_STRING:// String类型
result = cell.getRichStringCellValue().toString();
break;
case HSSFCell.CELL_TYPE_BLANK:
result = "";
default:
result = "";
break;

return result;
参考技术C 那就全部按照字符串读取,然后用Integer.parseInt()方法和new SimpleDateFormat().format()方法操作获得的字符串,没报异常就是对应的数字或时间,全报异常就是字符串本回答被提问者采纳 参考技术D 那就全部按照字符串读取,然后用Integer.parseInt()方法和new SimpleDateFormat().format()方法操作获得的字符串,没报异常就是对应的数字或时间,全报异常就是字符串

以上是关于pandas从excel读取数据数字类型过长出现科学计数法的问题的主要内容,如果未能解决你的问题,请参考以下文章

请问在Pandas用read_excel函数读取数据

java读取excel时间格式出现数字怎么处理

java读取excel时间格式出现数字怎么处理

Pandas只提供了读取啥文件的函数?

Pandas从入门到实战(day1)

.net sql数据库导出excel 数字字符过长被excel编译成。..... +18格式怎么