在用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])
- start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);
- stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
- 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删除序列的字符
注意:
- 当rm为空时,默认删除空白符(包括’\n’, ‘\r’, ‘\t’, ’ ')
- 这里的rm删除序列是只要边(开头或结尾)上的字符在删除序列内,就删除掉。
五、Python中元素索引函数loc[],iloc[]
loc[]函数用行列标签选择数据,前闭后闭。
-
索引单个元素:通过行索引“index”中的具体值来取行数据。括号里面是先行后列,以逗号分割,行和列分别是行标签和列标签。
-
索引区域:矩形区域的行标签,矩形区域的列标签,行列标签之间用逗号隔开,行标签和行标签之间,列标签和列标签之间用冒号隔开。
iloc[]函数用于行列数选择数据,前闭后开。
-
索引标签不同,具体用法同.loc[]函数。
-
.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
- 索引数字5:
data.loc["b","B"] #行标签为b,列标签为B
data.iloc[1,1] #5是第2行第2列,索引从0开始
- 索引区域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 :