python处理问题汇总一(for循环range内设置小数,四舍五入,时间差,读写文件等)

在用python处理数据的过程中,遇到了一些问题,查阅资料解决后,特此总结,方便以后查看。

一、如何设置for循环的range函数为小数

我们在使用for循环的时候,for循环可以遍历任何序列的项目,如一个列表或者一个字符串。
一般使用的语法为:

for iterating_var in sequence:
   statements(s)

另外一种执行循环的遍历方式是通过索引,如下实例:

fruits = ['banana', 'apple',  'mango']
for index in range(len(fruits)):
   print '当前水果 :', fruits[index]

以上实例我们使用了内置函数 len() 和 range(),函数 len() 返回列表的长度,即元素的个数。 range返回一个序列的数。

python range() 函数可创建一个整数列表,一般用在 for 循环中。
语法:

range(start, stop[, step])
  1. start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);
  2. stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
  3. step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)

这里无论是start,stop,step都是整数,如果想循环小数,比如range(0.1,0.5,0.01)

for i in range(0.1, 0.5, 0.01):
    print(i)

则出错:

Traceback (most recent call last):
  File "C:/Users/admin/PycharmProjects/untitled/learnpy.py", line 1, in <module>
    for i in range(0.1, 0.5, 0.01):
TypeError: 'float' object cannot be interpreted as an integer

这个时候,可以使用np.arange(0.1, 0.5, 0.01)来解决:

import numpy as np
for i in np.arange(0.1, 0.5, 0.01):
    print(i)
0.1
0.11
0.12
0.13
...

可以参考https://stackoverflow.com/questions/477486/how-to-use-a-decimal-range-step-value

同时,还可以使用

np.linspace(a, b, num)
for i in np.linspace(0.1, 0.5, 5):
    print(i)
0.1
0.2
0.3
0.4
0.5

二、python中的四舍五入问题

在处理数据的时候,有时候需要近似处理,经常使用的就是四舍五入的方法。python提供了几种四舍五入的方法。

1.round

round() 方法返回浮点数x的四舍五入值。

round( x [, n]  )

round函数可以保留n位小数,但不建议使用, 比如

print(round(2.235, 2))
print(round(2.345, 2))
2.23
2.35

一个四舍五入了一个没有,因为2.235在python内部存的是2.23499…的形式,四舍五入的时候末尾舍弃了,而2.345在python内部存储的是2.2345000…的形式。给定一个float类型的数我们无法知道其内部存储的形式,所以round用起来风险比较大。

如果非要用的话,可以在target number上加上一个比长度略长的小数,如下:

a = 2.235
print(round(a*100)/100.0)

2.24
2.%.nf形式

但这个也是不准的,如下:

print("%.2f"%(2.235))
print("%.2f"%(2.345))

2.23
2.35
3.Decimal函数

四舍五入的准确的形式,注意Decimal内传入的是string的形式。

a = Decimal(str(a)).quantize(Decimal("0.00"))
4.向上向下取整
import math
a = math.floor(10.63)  #向下取整
print(a)
b = math.ceil(10.63)   #向上取整
print(b)

10
11

三、python计算时间差

如何方便的计算两个时间的差,如两个时间相差几天,几小时等,使用datetime模块可以很方便的解决这个问题。

import datetime
d1 = datetime.datetime(2019, 3, 23)
d2 = datetime.datetime(2019, 10, 7)
dayCount = abs((d1 - d2).days)
print(dayCount)

198

python计算两个时间相差的秒数

print((endtime - starttime).seconds)

python计算时间相加,计算当前时间向后10天的时间。

import datetime
d1 = datetime.datetime.now()
d3 = d1 + datetime.timedelta(days=10)
print(d3.ctime())

Sat Sep 12 14:08:02 2020

其中参数可以是days, hours,minutes,seconds,microseconds,如果是负数就是向前多少时间。
其本上常用的类: datetime和timedelta两个。它们之间可以相互加减。每个类都有一些方法和属性可以查看具体的值,如 datetime可以查看:天数(day),小时数(hour),星期几(weekday())等;timedelta可以查看:天数(days),秒数 (seconds)等。

四、python对字符串切片操作

从文件夹读取文件名,去掉后缀

path = ' '
path_list = os.listdir(path)
print(path_list)
for file in (path_list):
    filename = os.path.splitext(file)[0]  #文件名,[1]为文件后缀

字符串替换replace:

filename = filename.replace('_', '') #将_去掉

字符串去掉最后3个字符:

filename = filename.replace(' ', '')[:-3].upper()

strip函数
函数原型

声明:s为字符串,rm为要删除的字符序列

s.strip(rm) 删除s字符串中开头、结尾处,位于 rm删除序列的字符

s.lstrip(rm) 删除s字符串中开头处,位于 rm删除序列的字符

s.rstrip(rm) 删除s字符串中结尾处,位于 rm删除序列的字符

注意:

  1. 当rm为空时,默认删除空白符(包括’\n’, ‘\r’, ‘\t’, ’ ')
  2. 这里的rm删除序列是只要边(开头或结尾)上的字符在删除序列内,就删除掉。

可以参考Python学习:字符串的深入浅出

五、Python中元素索引函数loc[],iloc[]

loc[]函数用行列标签选择数据,前闭后闭。

  1. 索引单个元素:通过行索引“index”中的具体值来取行数据。括号里面是先行后列,以逗号分割,行和列分别是行标签和列标签。

  2. 索引区域:矩形区域的行标签,矩形区域的列标签,行列标签之间用逗号隔开,行标签和行标签之间,列标签和列标签之间用冒号隔开。

iloc[]函数用于行列数选择数据,前闭后开。

  1. 索引标签不同,具体用法同.loc[]函数。

  2. .loc[]函数只能访问整型,不能访问布尔索引。

import pandas as pd
data  = pd.DataFrame({'A':[1,2,3],'B':[4,5,6],'C':[7,8,9]},index=["a","b","c"])
data

在这里插入图片描述

  1. 索引数字5:
data.loc["b","B"]    #行标签为b,列标签为B
data.iloc[1,1]    #5是第2行第2列,索引从0开始
  1. 索引区域5,8,6,9:
data.loc['b':'c','B':'C']
data.iloc[1:3,1:3]    #区间前闭后开

从文件中读取数据后,可通过iloc或loc读取数据

data = pd.read_csv('F:/CH2019BST.csv', encoding="ISO-8859-1")
time = data.iloc[:, 1]  #time为第二列数据
time = time.tolist()   #可以将数据直接转化为列表

六、python读取写入文件

1.python读取txt文件

(1)创建txt数据文件,创建好文件记得要关闭文件,不然读取不了文件内容
在这里插入图片描述
(2)读取txt文件

#读取txt文件
file=open("G:\\info.txt",'r',encoding='utf-8')
userlines=file.readlines()
file.close()
for line in userlines:
    username=line.split(',')[0] #读取用户名
    password=line.split(',')[1] #读取密码
    print(username,password)

2.python读取csv文件

import csv
file="G:\\info.csv"
filename=open(file)
reader=csv.reader(filename)
for row in reader:
     print("用户名:%s"%row[0],"密码:%s"%row[1])  #数组下标是以0开始的

3.python写入txt文件

将求得的变量写入txt文件:

filename1 = 'G:/info.txt'
    with open(filename1, 'a') as f:
        f.write(str(info))
        f.write('\n')

4.python写入csv文件

with open("G:\\user.csv", "a") as f:
        f.write(x)
        f.write('\n')

5.python中txt文件转csv文件

with open('G:/info.csv', 'w+', newline='') as csvfile:
    spamwriter = csv.writer(csvfile, dialect='excel')

    with open('G:/info.txt', 'r', encoding='utf-8') as filein:
        for line in filein:
            line_list = line.strip('\n').split(' ')
            spamwriter.writerow(line_list)

六、python判断list是否为nan

np.isnan(只有数组数值运算时可使用)
注意:numpy模块的isnan方法仅支持对数值进行判断,因此传入的如果是字符串类型会报错

如果list是整数元素:

import numpy as np
np.isnan(number)

如果list是字符元素:

if name[i] is not np.nan :
  • 25
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值