0%

1
import pandas as pd
1
2
3
4
file = r"D:\Stock\market_data\sh.600000.csv"
df = pd.read_csv(file)
df.tail()

date code open high low close preclose volume amount adjustflag turn tradestatus pctChg peTTM pbMRQ isST
2102 2023-10-16 sh.600000 7.12 7.13 7.04 7.07 7.10 24907733 1.760976e+08 2 0.0849 1 -0.4225 4.701935 0.345631 0
2103 2023-10-17 sh.600000 7.09 7.10 7.05 7.09 7.07 19029143 1.346301e+08 2 0.0648 1 0.2829 4.715236 0.346609 0
2104 2023-10-18 sh.600000 7.07 7.11 7.05 7.05 7.09 21485721 1.520630e+08 2 0.0732 1 -0.5642 4.688634 0.344653 0
2105 2023-10-19 sh.600000 7.04 7.05 6.83 6.84 7.05 61679771 4.259569e+08 2 0.2101 1 -2.9787 4.548972 0.334387 0
2106 2023-10-20 sh.600000 6.81 6.93 6.80 6.87 6.84 31067950 2.132038e+08 2 0.1058 1 0.4386 4.568924 0.335853 0

使用Pandas追加数据行到源文件中

  1. 举例: 将最后三行再次追加到文件末尾
  2. 恢复源文件,删除刚才追加进去的数据行
1
2
df1 = df.tail(3)
df1
date code open high low close preclose volume amount adjustflag turn tradestatus pctChg peTTM pbMRQ isST
2104 2023-10-18 sh.600000 7.07 7.11 7.05 7.05 7.09 21485721 1.520630e+08 2 0.0732 1 -0.5642 4.688634 0.344653 0
2105 2023-10-19 sh.600000 7.04 7.05 6.83 6.84 7.05 61679771 4.259569e+08 2 0.2101 1 -2.9787 4.548972 0.334387 0
2106 2023-10-20 sh.600000 6.81 6.93 6.80 6.87 6.84 31067950 2.132038e+08 2 0.1058 1 0.4386 4.568924 0.335853 0
1
2
3
4
5
6
7
8
9
10
11
12
13
# 将截取的三行数据追加到源文件中
df1.to_csv(file, mode="a", index=False, header=0)

# 查看结果
tmp = pd.read_csv(file)
tmp.tail(10)

# 删除重复的行,保留第一个。
tmp.drop_duplicates(subset='date',keep='first',inplace=True)
tmp.tail(10)

# 重新写入到csv文件中
tmp.to_csv(file,index=False, encoding='utf-8-sig')
date code open high low close preclose volume amount adjustflag turn tradestatus pctChg peTTM pbMRQ isST
2100 2023-10-12 sh.600000 7.09 7.17 7.06 7.14 7.02 36346964 2.592231e+08 2 0.1238 1 1.7094 4.748488 0.349053 0
2101 2023-10-13 sh.600000 7.11 7.15 7.08 7.10 7.14 19650410 1.397720e+08 2 0.0669 1 -0.5602 4.721886 0.347097 0
2102 2023-10-16 sh.600000 7.12 7.13 7.04 7.07 7.10 24907733 1.760976e+08 2 0.0849 1 -0.4225 4.701935 0.345631 0
2103 2023-10-17 sh.600000 7.09 7.10 7.05 7.09 7.07 19029143 1.346301e+08 2 0.0648 1 0.2829 4.715236 0.346609 0
2104 2023-10-18 sh.600000 7.07 7.11 7.05 7.05 7.09 21485721 1.520630e+08 2 0.0732 1 -0.5642 4.688634 0.344653 0
2105 2023-10-19 sh.600000 7.04 7.05 6.83 6.84 7.05 61679771 4.259569e+08 2 0.2101 1 -2.9787 4.548972 0.334387 0
2106 2023-10-20 sh.600000 6.81 6.93 6.80 6.87 6.84 31067950 2.132038e+08 2 0.1058 1 0.4386 4.568924 0.335853 0
2107 2023-10-18 sh.600000 7.07 7.11 7.05 7.05 7.09 21485721 1.520630e+08 2 0.0732 1 -0.5642 4.688634 0.344653 0
2108 2023-10-19 sh.600000 7.04 7.05 6.83 6.84 7.05 61679771 4.259569e+08 2 0.2101 1 -2.9787 4.548972 0.334387 0
2109 2023-10-20 sh.600000 6.81 6.93 6.80 6.87 6.84 31067950 2.132038e+08 2 0.1058 1 0.4386 4.568924 0.335853 0
date code open high low close preclose volume amount adjustflag turn tradestatus pctChg peTTM pbMRQ isST
2097 2023-10-09 sh.600000 7.08 7.08 7.00 7.03 7.10 27763130 1.952144e+08 2 0.0946 1 -0.9859 4.675332 0.343675 0
2098 2023-10-10 sh.600000 7.13 7.14 7.01 7.01 7.03 24095561 1.698562e+08 2 0.0821 1 -0.2845 4.662031 0.342698 0
2099 2023-10-11 sh.600000 7.06 7.08 7.01 7.02 7.01 24057412 1.693714e+08 2 0.0820 1 0.1427 4.668682 0.343187 0
2100 2023-10-12 sh.600000 7.09 7.17 7.06 7.14 7.02 36346964 2.592231e+08 2 0.1238 1 1.7094 4.748488 0.349053 0
2101 2023-10-13 sh.600000 7.11 7.15 7.08 7.10 7.14 19650410 1.397720e+08 2 0.0669 1 -0.5602 4.721886 0.347097 0
2102 2023-10-16 sh.600000 7.12 7.13 7.04 7.07 7.10 24907733 1.760976e+08 2 0.0849 1 -0.4225 4.701935 0.345631 0
2103 2023-10-17 sh.600000 7.09 7.10 7.05 7.09 7.07 19029143 1.346301e+08 2 0.0648 1 0.2829 4.715236 0.346609 0
2104 2023-10-18 sh.600000 7.07 7.11 7.05 7.05 7.09 21485721 1.520630e+08 2 0.0732 1 -0.5642 4.688634 0.344653 0
2105 2023-10-19 sh.600000 7.04 7.05 6.83 6.84 7.05 61679771 4.259569e+08 2 0.2101 1 -2.9787 4.548972 0.334387 0
2106 2023-10-20 sh.600000 6.81 6.93 6.80 6.87 6.84 31067950 2.132038e+08 2 0.1058 1 0.4386 4.568924 0.335853 0

不使用Pandas,直接使用 readlines() 函数

  1. 获取文本文件的行列表
  2. 将列表的最后三个追加到原列表中
  3. 将新列表写入到文件中
1
2
3
4
5
6
with open(file,'r',encoding='utf-8') as f:
lst = f.readlines()


lst[-10:]

['2023-10-09,sh.600000,7.08,7.08,7.0,7.03,7.1,27763130,195214392.39,2,0.0946,1,-0.9859,4.675332,0.343675,0\n',
 '2023-10-10,sh.600000,7.13,7.14,7.01,7.01,7.03,24095561,169856240.67,2,0.0821,1,-0.2845,4.662031,0.342698,0\n',
 '2023-10-11,sh.600000,7.06,7.08,7.01,7.02,7.01,24057412,169371363.46,2,0.082,1,0.1427,4.668682,0.343187,0\n',
 '2023-10-12,sh.600000,7.09,7.17,7.06,7.14,7.02,36346964,259223143.18,2,0.1238,1,1.7094,4.748488,0.349053,0\n',
 '2023-10-13,sh.600000,7.11,7.15,7.08,7.1,7.14,19650410,139771981.93,2,0.0669,1,-0.5602,4.721886,0.347097,0\n',
 '2023-10-16,sh.600000,7.12,7.13,7.04,7.07,7.1,24907733,176097574.11,2,0.0849,1,-0.4225,4.701935,0.345631,0\n',
 '2023-10-17,sh.600000,7.09,7.1,7.05,7.09,7.07,19029143,134630097.48,2,0.0648,1,0.2829,4.715236,0.346609,0\n',
 '2023-10-18,sh.600000,7.07,7.11,7.05,7.05,7.09,21485721,152063023.64,2,0.0732,1,-0.5642,4.688634,0.344653,0\n',
 '2023-10-19,sh.600000,7.04,7.05,6.83,6.84,7.05,61679771,425956887.36,2,0.2101,1,-2.9787,4.548972,0.334387,0\n',
 '2023-10-20,sh.600000,6.81,6.93,6.8,6.87,6.84,31067950,213203780.58,2,0.1058,1,0.4386,4.568924,0.335853,0\n']
1
2
3
add = lst[-3:]
add

['2023-10-18,sh.600000,7.07,7.11,7.05,7.05,7.09,21485721,152063023.64,2,0.0732,1,-0.5642,4.688634,0.344653,0\n',
 '2023-10-19,sh.600000,7.04,7.05,6.83,6.84,7.05,61679771,425956887.36,2,0.2101,1,-2.9787,4.548972,0.334387,0\n',
 '2023-10-20,sh.600000,6.81,6.93,6.8,6.87,6.84,31067950,213203780.58,2,0.1058,1,0.4386,4.568924,0.335853,0\n']
1
2
3
new = lst + add
new[-10:]

['2023-10-12,sh.600000,7.09,7.17,7.06,7.14,7.02,36346964,259223143.18,2,0.1238,1,1.7094,4.748488,0.349053,0\n',
 '2023-10-13,sh.600000,7.11,7.15,7.08,7.1,7.14,19650410,139771981.93,2,0.0669,1,-0.5602,4.721886,0.347097,0\n',
 '2023-10-16,sh.600000,7.12,7.13,7.04,7.07,7.1,24907733,176097574.11,2,0.0849,1,-0.4225,4.701935,0.345631,0\n',
 '2023-10-17,sh.600000,7.09,7.1,7.05,7.09,7.07,19029143,134630097.48,2,0.0648,1,0.2829,4.715236,0.346609,0\n',
 '2023-10-18,sh.600000,7.07,7.11,7.05,7.05,7.09,21485721,152063023.64,2,0.0732,1,-0.5642,4.688634,0.344653,0\n',
 '2023-10-19,sh.600000,7.04,7.05,6.83,6.84,7.05,61679771,425956887.36,2,0.2101,1,-2.9787,4.548972,0.334387,0\n',
 '2023-10-20,sh.600000,6.81,6.93,6.8,6.87,6.84,31067950,213203780.58,2,0.1058,1,0.4386,4.568924,0.335853,0\n',
 '2023-10-18,sh.600000,7.07,7.11,7.05,7.05,7.09,21485721,152063023.64,2,0.0732,1,-0.5642,4.688634,0.344653,0\n',
 '2023-10-19,sh.600000,7.04,7.05,6.83,6.84,7.05,61679771,425956887.36,2,0.2101,1,-2.9787,4.548972,0.334387,0\n',
 '2023-10-20,sh.600000,6.81,6.93,6.8,6.87,6.84,31067950,213203780.58,2,0.1058,1,0.4386,4.568924,0.335853,0\n']
1
2
3
4
5
6
7
8
with open(file,'w',encoding='utf-8') as f:
f.writelines(new)
f.close()



# 查看
pd.read_csv(file).tail(10)
date code open high low close preclose volume amount adjustflag turn tradestatus pctChg peTTM pbMRQ isST
2100 2023-10-12 sh.600000 7.09 7.17 7.06 7.14 7.02 36346964 2.592231e+08 2 0.1238 1 1.7094 4.748488 0.349053 0
2101 2023-10-13 sh.600000 7.11 7.15 7.08 7.10 7.14 19650410 1.397720e+08 2 0.0669 1 -0.5602 4.721886 0.347097 0
2102 2023-10-16 sh.600000 7.12 7.13 7.04 7.07 7.10 24907733 1.760976e+08 2 0.0849 1 -0.4225 4.701935 0.345631 0
2103 2023-10-17 sh.600000 7.09 7.10 7.05 7.09 7.07 19029143 1.346301e+08 2 0.0648 1 0.2829 4.715236 0.346609 0
2104 2023-10-18 sh.600000 7.07 7.11 7.05 7.05 7.09 21485721 1.520630e+08 2 0.0732 1 -0.5642 4.688634 0.344653 0
2105 2023-10-19 sh.600000 7.04 7.05 6.83 6.84 7.05 61679771 4.259569e+08 2 0.2101 1 -2.9787 4.548972 0.334387 0
2106 2023-10-20 sh.600000 6.81 6.93 6.80 6.87 6.84 31067950 2.132038e+08 2 0.1058 1 0.4386 4.568924 0.335853 0
2107 2023-10-18 sh.600000 7.07 7.11 7.05 7.05 7.09 21485721 1.520630e+08 2 0.0732 1 -0.5642 4.688634 0.344653 0
2108 2023-10-19 sh.600000 7.04 7.05 6.83 6.84 7.05 61679771 4.259569e+08 2 0.2101 1 -2.9787 4.548972 0.334387 0
2109 2023-10-20 sh.600000 6.81 6.93 6.80 6.87 6.84 31067950 2.132038e+08 2 0.1058 1 0.4386 4.568924 0.335853 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 删除重复的行
with open(file,'r',encoding='utf-8') as f:
lst = f.readlines()
f.close()

new = lst[:-3]
new[-10:]

# 写入新数据到文件
with open(file,'w',encoding='utf-8') as f:
f.writelines(new)
f.close()
# 查看
pd.read_csv(file).tail(10)
['2023-10-09,sh.600000,7.08,7.08,7.0,7.03,7.1,27763130,195214392.39,2,0.0946,1,-0.9859,4.675332,0.343675,0\n',
 '2023-10-10,sh.600000,7.13,7.14,7.01,7.01,7.03,24095561,169856240.67,2,0.0821,1,-0.2845,4.662031,0.342698,0\n',
 '2023-10-11,sh.600000,7.06,7.08,7.01,7.02,7.01,24057412,169371363.46,2,0.082,1,0.1427,4.668682,0.343187,0\n',
 '2023-10-12,sh.600000,7.09,7.17,7.06,7.14,7.02,36346964,259223143.18,2,0.1238,1,1.7094,4.748488,0.349053,0\n',
 '2023-10-13,sh.600000,7.11,7.15,7.08,7.1,7.14,19650410,139771981.93,2,0.0669,1,-0.5602,4.721886,0.347097,0\n',
 '2023-10-16,sh.600000,7.12,7.13,7.04,7.07,7.1,24907733,176097574.11,2,0.0849,1,-0.4225,4.701935,0.345631,0\n',
 '2023-10-17,sh.600000,7.09,7.1,7.05,7.09,7.07,19029143,134630097.48,2,0.0648,1,0.2829,4.715236,0.346609,0\n',
 '2023-10-18,sh.600000,7.07,7.11,7.05,7.05,7.09,21485721,152063023.64,2,0.0732,1,-0.5642,4.688634,0.344653,0\n',
 '2023-10-19,sh.600000,7.04,7.05,6.83,6.84,7.05,61679771,425956887.36,2,0.2101,1,-2.9787,4.548972,0.334387,0\n',
 '2023-10-20,sh.600000,6.81,6.93,6.8,6.87,6.84,31067950,213203780.58,2,0.1058,1,0.4386,4.568924,0.335853,0\n']
date code open high low close preclose volume amount adjustflag turn tradestatus pctChg peTTM pbMRQ isST
2097 2023-10-09 sh.600000 7.08 7.08 7.00 7.03 7.10 27763130 1.952144e+08 2 0.0946 1 -0.9859 4.675332 0.343675 0
2098 2023-10-10 sh.600000 7.13 7.14 7.01 7.01 7.03 24095561 1.698562e+08 2 0.0821 1 -0.2845 4.662031 0.342698 0
2099 2023-10-11 sh.600000 7.06 7.08 7.01 7.02 7.01 24057412 1.693714e+08 2 0.0820 1 0.1427 4.668682 0.343187 0
2100 2023-10-12 sh.600000 7.09 7.17 7.06 7.14 7.02 36346964 2.592231e+08 2 0.1238 1 1.7094 4.748488 0.349053 0
2101 2023-10-13 sh.600000 7.11 7.15 7.08 7.10 7.14 19650410 1.397720e+08 2 0.0669 1 -0.5602 4.721886 0.347097 0
2102 2023-10-16 sh.600000 7.12 7.13 7.04 7.07 7.10 24907733 1.760976e+08 2 0.0849 1 -0.4225 4.701935 0.345631 0
2103 2023-10-17 sh.600000 7.09 7.10 7.05 7.09 7.07 19029143 1.346301e+08 2 0.0648 1 0.2829 4.715236 0.346609 0
2104 2023-10-18 sh.600000 7.07 7.11 7.05 7.05 7.09 21485721 1.520630e+08 2 0.0732 1 -0.5642 4.688634 0.344653 0
2105 2023-10-19 sh.600000 7.04 7.05 6.83 6.84 7.05 61679771 4.259569e+08 2 0.2101 1 -2.9787 4.548972 0.334387 0
2106 2023-10-20 sh.600000 6.81 6.93 6.80 6.87 6.84 31067950 2.132038e+08 2 0.1058 1 0.4386 4.568924 0.335853 0

1
2
3
4
import pandas as pd 

file = r"D:\Stock\market_data\sz.301379.csv"
pd.read_csv(file,index_col='date')

out:

code open high low close preclose volume amount adjustflag turn tradestatus pctChg peTTM pbMRQ isST
date
2022-11-01 sz.301379 31.51 35.00 30.98 32.10 31.51 12174623 3.954513e+08 2 50.6603 1 1.8724 27.622495 6.457838 0
2022-11-02 sz.301379 33.50 34.38 32.55 32.63 32.10 9898625 3.297200e+08 2 41.1896 1 1.6511 28.078567 6.564463 0
2022-11-03 sz.301379 30.70 31.08 29.88 30.95 32.63 8228578 2.516198e+08 2 34.2403 1 -5.1486 26.632904 6.226483 0
2022-11-04 sz.301379 30.61 31.59 30.30 30.94 30.95 6517006 2.014447e+08 2 27.1182 1 -0.0323 26.624299 6.224471 0
2022-11-07 sz.301379 30.66 31.94 30.65 31.41 30.94 6801484 2.128195e+08 2 28.3019 1 1.5191 27.028741 6.319025 0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
2023-10-16 sz.301379 32.79 32.79 30.83 31.14 32.64 2875587 9.040269e+07 2 11.3480 1 -4.5956 25.916098 2.521440 0
2023-10-17 sz.301379 31.37 31.37 30.50 30.63 31.14 1355321 4.168925e+07 2 5.3485 1 -1.6378 25.491653 2.480145 0
2023-10-18 sz.301379 30.47 30.70 29.81 29.81 30.63 1317991 3.968151e+07 2 5.2012 1 -2.6771 24.809213 2.413749 0
2023-10-19 sz.301379 29.43 31.14 29.30 29.98 29.81 1548600 4.724414e+07 2 6.1113 1 0.5703 24.950694 2.427514 0
2023-10-20 sz.301379 30.26 30.35 29.08 29.10 29.98 1191500 3.522436e+07 2 4.7021 1 -2.9353 24.218319 2.356259 0

236 rows × 15 columns

如果想跳过其中的某些行,只要读取文件末的10行数据

  1. 首先要知道该文件总共有多少行;
  2. 然后使用skiprows参数跳过倒数第10行前的那些行数
查看文件的行数

open(csv_file) + readlines() 函数读取文件的行数

1
2
3
4
5
6
7
8
9
# 打开csv文件
f = open(file= file,mode='r',encoding='utf-8')

# 读取文件的所有行;每行的数据作为一个字符串元素装入到一个列表中
ls = f.readlines()

# 查看列表的长度,其中包含表头的那一行
ls[0]
len(ls)

out:

‘\ufeffdate,code,open,high,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,peTTM,pbMRQ,isST\n’

237
1
2
3
# 如果只要读取文件的最后10行
ls_row = [i for i in range(1,len(ls)-10)]
pd.read_csv(file,index_col='date',skiprows=ls_row)

out:

code open high low close preclose volume amount adjustflag turn tradestatus pctChg peTTM pbMRQ isST
date
2023-10-09 sz.301379 31.39 32.10 31.36 32.02 31.70 1512800 4.820541e+07 2 5.9700 1 1.0095 26.648473 2.592695 0
2023-10-10 sz.301379 32.26 32.44 31.85 32.10 32.02 1630565 5.242501e+07 2 6.4347 1 0.2498 26.715053 2.599173 0
2023-10-11 sz.301379 32.60 32.90 31.85 32.42 32.10 1837178 5.939962e+07 2 7.2501 1 0.9969 26.981371 2.625083 0
2023-10-12 sz.301379 32.43 32.64 31.65 31.83 32.42 1323548 4.227372e+07 2 5.2232 1 -1.8199 26.490347 2.577310 0
2023-10-13 sz.301379 31.76 33.58 31.45 32.64 31.83 3304300 1.081152e+08 2 13.0399 1 2.5448 27.164465 2.642897 0
2023-10-16 sz.301379 32.79 32.79 30.83 31.14 32.64 2875587 9.040269e+07 2 11.3480 1 -4.5956 25.916098 2.521440 0
2023-10-17 sz.301379 31.37 31.37 30.50 30.63 31.14 1355321 4.168925e+07 2 5.3485 1 -1.6378 25.491653 2.480145 0
2023-10-18 sz.301379 30.47 30.70 29.81 29.81 30.63 1317991 3.968151e+07 2 5.2012 1 -2.6771 24.809213 2.413749 0
2023-10-19 sz.301379 29.43 31.14 29.30 29.98 29.81 1548600 4.724414e+07 2 6.1113 1 0.5703 24.950694 2.427514 0
2023-10-20 sz.301379 30.26 30.35 29.08 29.10 29.98 1191500 3.522436e+07 2 4.7021 1 -2.9353 24.218319 2.356259 0

1
2
3
4
5
6
import pandas as pd

url = "https://www.icauto.com.cn/rank/"

data = pd.read_html(url, index_col=0, header=0)[0]
data.head()

output:

车型 资料信息 月销量 年累计
#
1 Model Y 品牌:特斯拉,指导价:26.39-34.99万 41428 320109
2 秦PLUS 品牌:比亚迪,指导价:9.98-20.99万 39904 317115
3 宋PLUS新能源 品牌:比亚迪,指导价:15.38-21.98万 36773 276140
4 海鸥 品牌:比亚迪,指导价:7.88-9.58万 35011 119828
5 朗逸 品牌:大众,指导价:9.40-15.19万 32105 246656

.str.contains()

  1. 字符串中包含
  2. 可以使用模糊
  3. 可以使用正则
  4. 仅对字符串格式有效,对数字列不能使用,如果要对数字格式列使用,需要先将其转化成str
1
2
3
4
5
6
7
8
9
10
11
'''
语法:
Series.str.contains(
pat, # 要查询的字符串、要查询的或者正则表达式
case=True, # 区分大小写
flags=0, # 用来传给正则模块的参数,比如 flags=re.INGNORECASE 等价于 case=False
na=nan, # 默认对空值不处理,即输出结果还是 NaN
regex=True # 即第一个参数 pat部分 要不要按照正则表达式的规则。所以针对特殊符号,默认情况下我们必须使用转义符,或者设置 regex=False
)

'''
1
data[data['资料信息'].str.contains('比亚迪')]

output:

车型 资料信息 月销量 年累计
#
2 秦PLUS 品牌:比亚迪,指导价:9.98-20.99万 39904 317115
3 宋PLUS新能源 品牌:比亚迪,指导价:15.38-21.98万 36773 276140
4 海鸥 品牌:比亚迪,指导价:7.88-9.58万 35011 119828
7 元PLUS 品牌:比亚迪,指导价:13.28-15.98万 28727 217670
10 海豚 品牌:比亚迪,指导价:11.68-13.98万 24282 221579
14 品牌:比亚迪,指导价:18.98-33.18万 21798 166436
18 宋Pro新能源 品牌:比亚迪,指导价:12.98-16.98万 20798 140211
50 唐新能源 品牌:比亚迪,指导价:20.98-34.28万 11366 105694
82 驱逐舰05 品牌:比亚迪,指导价:10.18-14.88万 7950 62832
144 海豹DM-i 品牌:比亚迪,指导价:18.68-25.00万 3890 3890
157 海豹 品牌:比亚迪,指导价:18.98-28.00万 3401 53361
167 护卫舰07 品牌:比亚迪,指导价:21.58-28.00万 3085 56298
209 比亚迪e2 品牌:比亚迪,指导价:10.28-14.78万 2106 14695
211 秦新能源 品牌:比亚迪,指导价:12.99-17.48万 2070 23118
215 元Pro 品牌:比亚迪,指导价:9.98-11.98万 1996 7104
350 比亚迪e6 品牌:比亚迪,指导价:0.00万 662 1391
386 宋MAX新能源 品牌:比亚迪,指导价:14.68-17.28万 436 3679
450 比亚迪e3 品牌:比亚迪,指导价:14.98-15.48万 211 1178
479 比亚迪D1 品牌:比亚迪,指导价:15.78-16.98万 114 583
1
2
# 筛选品牌  特斯拉、极氪、极狐、阿维塔、高合
data[data['资料信息'].str.contains('极氪|特斯拉|高合|极狐|阿维塔')]

output:

车型 资料信息 月销量 年累计
#
1 Model Y 品牌:特斯拉,指导价:26.39-34.99万 41428 320109
72 极氪001 品牌:极氪,指导价:30.00-40.30万 8701 52998
210 Model 3 品牌:特斯拉,指导价:25.99-29.59万 2079 113620
229 极氪X 品牌:极氪,指导价:18.98-22.98万 1725 12675
237 阿维塔11 品牌:阿维塔,指导价:30.00-60.00万 1659 14744
239 极氪009 品牌:极氪,指导价:49.90-58.80万 1627 13355
241 高合HiPhi Y 品牌:高合汽车,指导价:33.90-44.90万 1556 1556
254 极狐考拉 品牌:ARCFOX极狐,指导价:13.38-17.18万 1405 1612
270 极狐 阿尔法S(ARCFOX αS) 品牌:ARCFOX极狐,指导价:18.98-35.63万 1245 9307
401 极狐 阿尔法T(ARCFOX αT) 品牌:ARCFOX极狐,指导价:18.58-33.13万 355 4137
466 高合HiPhi Z 品牌:高合汽车,指导价:60.00-80.00万 154 154
531 高合HiPhi X 品牌:高合汽车,指导价:57.00-80.00万 25 25
1
2
3
#筛选起售价60万元的
data[data['资料信息'].str.contains('[6-9]\d+\.\d+\-\d+', regex=True)]

output:

车型 资料信息 月销量 年累计
#
78 宝马X5 品牌:宝马,指导价:60.50-80.00万 8266 72738
466 高合HiPhi Z 品牌:高合汽车,指导价:60.00-80.00万 154 154
1
2
#筛选起售价<10万元的,最高价不超过20
data[data['资料信息'].str.contains('\D+.\.\d+\-[1]+', regex=True)]

output:

车型 资料信息 月销量 年累计
#
5 朗逸 品牌:大众,指导价:9.40-15.19万 32105 246656
6 轩逸 品牌:日产,指导价:9.98-17.49万 30028 257065
11 哈弗H6 品牌:哈弗,指导价:9.89-15.70万 23423 147596
33 新帝豪 品牌:吉利汽车,指导价:6.29-12.98万 14058 102970
36 科鲁泽 品牌:雪佛兰,指导价:9.49-10.89万 13665 90999
... ... ... ... ...
552 无界PRO 品牌:奇瑞新能源,指导价:7.99-10.19万 12 822
563 宝骏RC-5 品牌:宝骏,指导价:6.98-11.08万 6 396
570 标致301 品牌:标致,指导价:8.47-10.77万 4 4
583 悦动 品牌:现代,指导价:8.49-11.59万 1 7704
587 宝骏RM-5 品牌:宝骏,指导价:7.88-12.08万 1 35

67 rows × 4 columns

1
2
3
# 如果要对数字格式列使用,需要先将其转化成str
# 到年累计列进行筛选.年累计超过20万的
data[data['年累计'].astype(str).str.contains('[2-9][0-9]{5,}', regex=True)]

output:

车型 资料信息 月销量 年累计
#
1 Model Y 品牌:特斯拉,指导价:26.39-34.99万 41428 320109
2 秦PLUS 品牌:比亚迪,指导价:9.98-20.99万 39904 317115
3 宋PLUS新能源 品牌:比亚迪,指导价:15.38-21.98万 36773 276140
5 朗逸 品牌:大众,指导价:9.40-15.19万 32105 246656
6 轩逸 品牌:日产,指导价:9.98-17.49万 30028 257065
7 元PLUS 品牌:比亚迪,指导价:13.28-15.98万 28727 217670
10 海豚 品牌:比亚迪,指导价:11.68-13.98万 24282 221579

1
import pandas as pd 

Pandas中的应用

1
2
3
4
5
6
url = "https://www.icauto.com.cn/rank/"

data = pd.read_html(url, index_col=0, header=0)[0]
data.rename(columns={'年累计':'年销量'},inplace=True)
data

车型 资料信息 月销量 年销量
#
1 Model Y 品牌:特斯拉,指导价:26.39-34.99万 41428 320109
2 秦PLUS 品牌:比亚迪,指导价:9.98-20.99万 39904 317115
3 宋PLUS新能源 品牌:比亚迪,指导价:15.38-21.98万 36773 276140
4 海鸥 品牌:比亚迪,指导价:7.88-9.58万 35011 119828
5 朗逸 品牌:大众,指导价:9.40-15.19万 32105 246656
... ... ... ... ...
583 悦动 品牌:现代,指导价:8.49-11.59万 1 7704
584 名爵6新能源 品牌:MG名爵,指导价:14.58-19.98万 1 86
585 卡罗拉双擎E+ 品牌:丰田,指导价:20.78-23.08万 1 415
586 荣威i6 MAX 品牌:荣威,指导价:11.00-13.00万 1 543
587 宝骏RM-5 品牌:宝骏,指导价:7.88-12.08万 1 35

587 rows × 4 columns

列表的形式

df.filter(items=[*,*, ])

  1. items = list
  2. 列表内的元素:
    1. 列名称
    2. index
1
2
# 过滤列,select columns by name
data.filter(items=['车型','月销量'],axis=1)
车型 月销量
#
1 Model Y 41428
2 秦PLUS 39904
3 宋PLUS新能源 36773
4 海鸥 35011
5 朗逸 32105
... ... ...
583 悦动 1
584 名爵6新能源 1
585 卡罗拉双擎E+ 1
586 荣威i6 MAX 1
587 宝骏RM-5 1

587 rows × 2 columns

1
2
# 过滤行
data.filter(items=[10,100,200,300,400],axis =0)
车型 资料信息 月销量 年销量
#
10 海豚 品牌:比亚迪,指导价:11.68-13.98万 24282 221579
100 蒙迪欧 品牌:福特,指导价:14.98-21.68万 6600 37277
200 奥迪Q4 e-tron 品牌:奥迪,指导价:28.99-38.00万 2406 16192
300 传祺GS4 品牌:广汽传祺,指导价:8.98-13.18万 966 17405
400 传祺GS4 PLUS 品牌:广汽传祺,指导价:12.68-14.98万 356 5253
like 模糊查询筛选
  1. like = str
1
2
# 过滤行 
data.filter(like='00',axis=0)
车型 资料信息 月销量 年销量
#
100 蒙迪欧 品牌:福特,指导价:14.98-21.68万 6600 37277
200 奥迪Q4 e-tron 品牌:奥迪,指导价:28.99-38.00万 2406 16192
300 传祺GS4 品牌:广汽传祺,指导价:8.98-13.18万 966 17405
400 传祺GS4 PLUS 品牌:广汽传祺,指导价:12.68-14.98万 356 5253
500 风光E3 品牌:东风风光,指导价:12.98-15.98万 67 337
regex=’ ‘ 正则查询筛选
  1. regex = str
1
data.filter(axis=1,regex='^年')
年销量
#
1 320109
2 317115
3 276140
4 119828
5 246656
... ...
583 7704
584 86
585 415
586 543
587 35

587 rows × 1 columns

1
2
3
# 正则还可以是多个条件
data.filter(axis=0, regex='^1[0-9]9$')

车型 资料信息 月销量 年销量
#
109 北京EU5 品牌:北京汽车,指导价:12.00-17.19万 5320 39695
119 奔驰A级 品牌:奔驰,指导价:21.48-27.22万 4835 39571
129 坦克500新能源 品牌:坦克,指导价:36.00万 4269 9328
139 江淮A5 PLUS 品牌:江淮,指导价:6.58-10.98万 4007 16717
149 科莱威CLEVER 品牌:荣威,指导价:6.00万 3590 15939
159 奥德赛 品牌:本田,指导价:23.58-43.98万 3388 28598
169 缤瑞 品牌:吉利汽车,指导价:9.58-11.08万 3062 22268
179 威飒 品牌:丰田,指导价:21.68-31.00万 2753 22241
189 捷途X90 品牌:捷途,指导价:8.89-17.29万 2561 18449
199 福瑞迪 品牌:起亚,指导价:8.08-10.48万 2416 20057
1
2
data.filter(axis=0, regex='[0-9]99$|[0-9]88$')

车型 资料信息 月销量 年销量
#
188 蔚来ET5T 品牌:蔚来,指导价:万 2593 8015
199 福瑞迪 品牌:起亚,指导价:8.08-10.48万 2416 20057
288 劲客 品牌:日产,指导价:8.98-13.78万 1058 4609
299 王牌M7 品牌:北汽制造,指导价:6.18-13.98万 979 3973
388 VGV U70 PRO 品牌:中国重汽VGV,指导价:7.78-11.58万 428 2836
399 风光380 品牌:东风风光,指导价:5.38-6.08万 357 2333
488 福特电马 品牌:福特,指导价:26.50-36.99万 93 1545
499 沃兰多 品牌:雪佛兰,指导价:0.00万 68 1788
1
2
data.filter(axis=0, regex='^[3,5,9][8-9]$')

车型 资料信息 月销量 年销量
#
38 奥迪Q5L 品牌:奥迪,指导价:39.68-48.88万 13518 98329
39 博越L 品牌:吉利汽车,指导价:12.87-17.58万 13036 102066
58 星瑞 品牌:吉利汽车,指导价:10.87-14.97万 10396 79847
59 腾势D9 品牌:腾势,指导价:33.50-66.00万 10249 87594
98 汉兰达 品牌:丰田,指导价:26.88-34.88万 6775 53301
99 凯迪拉克CT5 品牌:凯迪拉克,指导价:27.97-36.17万 6767 57081
多级过滤
1
2
data.filter(axis=0,regex='^1[0-9]9$').filter(like='8',axis=0)

车型 资料信息 月销量 年销量
#
189 捷途X90 品牌:捷途,指导价:8.89-17.29万 2561 18449

1
2
3
4
5
6
import os
import re

import numpy as np
import pandas as pd
from heapq import nlargest,nsmallest

下载数据

1
2
3
url = "http://www.51chanlun.com/hot.html"
df = pd.read_html(url, header=0, encoding="utf-8")[3]
df.head(2)
概念类别 新高个股数 板块是否强势 板块强弱指标 强弱变化% 近10日分 中10日分 远10日分 1110 1109 ... 0412 0411 0410 0407 0406 0405 0404 0403 0331 0330
0 汽车类 7 0 4.2240 -12.66 26 27 23 001=5 003=5 ... 015=2 015=1 N N N N N 013=3 018=1 001=5
1 工业机械 9 0 4.5852 -3.58 20 20 20 002=4 018=1 ... 006=7 009=3 006=3 013=3 004=7 008=3 008=3 015=3 004=5 014=1

2 rows × 159 columns

过滤需要的数据列

1
2
3
4
5
df = df.filter(
["概念类别", "新高个股数", "板块是否强势", "板块强弱指标"])

df.columns = ['type','num','strong','index']
df.sample(8)
type num strong index
32 多元金融 0 0 2.1333
39 电信运营 0 1 4.0000
33 家居用品 2 1 4.5714
24 交通设施 2 0 3.1395
4 半导体 10 0 5.1925
19 文教休闲 2 0 3.5660
49 通信设备 4 0 4.9091
51 酒店餐饮 0 0 1.0000

Query 函数筛选

  • query : 查询的意思

语法:df.query(expr,inplace = False,** kwargs) # 使用布尔表达式查询帧的列
参数:

  • expr:str要评估的查询字符串。你可以在环境中引用变量,在它们前面添加一个‘@’字符 。@a + b
  • inplace=False:是否修改数据或返回副本
  • kwargs:dict关键字参数
  • 返回:DataFrame

注意:

  • 默认修改Python语法’&’/‘and’和’|’/‘or’位运算符优先级高于布尔表达式,不同于Python

  • 关键字参数parser=’python’执行Python评估。

  • engine=’python’ 用Python本身作为后端来传递评估表达式。不建议效率低。

  • 默认实例df.index和 df.columns属性 DataFrame放在查询命名空间中,

  • 这允许您将框架的索引和列视为框架中的列。标识符index用于帧索引;

  • 您还可以使用索引的名称在查询中标识它。

性能:

  • 涉及NumPy数组或Pandas DataFrames的复合表达式都会导致隐式创建临时数组
  • eval/query用在数据(df.values.nbytes>1万)性能提升明显;传统方法在小数组时运行得更快;
  • eval/query好处主要时节省内存,以及有时候简洁得语法
  • 可用指定不同解析器和引擎来运行这些查询;参见”Enhancing Performance” 。

条件是一个字符串的形式

1
df.query("num >= 10")  # 等价于  df[df['num']>=10]
type num strong index
3 化工 16 1 4.5868
4 半导体 10 0 5.1925
13 元器件 12 0 5.7186
1
df.query("type.str.contains('电')  & num >= 5")
type num strong index
2 电气设备 6 0 4.1577
9 家用电器 6 0 4.4304

@ 符号来标记本地变量

1
2
3
4
5
# 设定条件
Bmean = df["num"].mean() + 3

# 列 num 的值 `>` 条件Beam
df.query("num>@Bmean")
type num strong index
0 汽车类 7 0 4.2240
1 工业机械 9 0 4.5852
2 电气设备 6 0 4.1577
3 化工 16 1 4.5868
4 半导体 10 0 5.1925
5 软件服务 7 0 4.5000
9 家用电器 6 0 4.4304
13 元器件 12 0 5.7186
30 医药 8 0 5.3627
1
2
3
4
# 或者:
Beam = df['num'] > df['num'].mean() + 3
df.query("@Beam") # 同上等价

type num strong index
0 汽车类 7 0 4.2240
1 工业机械 9 0 4.5852
2 电气设备 6 0 4.1577
3 化工 16 1 4.5868
4 半导体 10 0 5.1925
5 软件服务 7 0 4.5000
9 家用电器 6 0 4.4304
13 元器件 12 0 5.7186
30 医药 8 0 5.3627

eval 的应用

1
2
3
# num 列的值 > 10
tj = df.eval("num >10 ")
df.query("@tj")
type num strong index
3 化工 16 1 4.5868
13 元器件 12 0 5.7186
1
2
3
# num 列的值 > 10 并且 strong == 1
tj = df.eval("(num >=10) & (strong ==1)")
df.query("@tj")
type num strong index
3 化工 16 1 4.5868
1
2
3
# NUM 、Index列的值均大于其平均值
tj = df.eval('num > num.mean() & index > index.mean()')
df.query('@tj')
type num strong index
0 汽车类 7 0 4.2240
1 工业机械 9 0 4.5852
2 电气设备 6 0 4.1577
3 化工 16 1 4.5868
4 半导体 10 0 5.1925
5 软件服务 7 0 4.5000
7 供气供热 5 1 5.0233
9 家用电器 6 0 4.4304
13 元器件 12 0 5.7186
16 通用机械 3 0 4.6172
18 煤炭 5 1 5.7273
29 医疗保健 5 0 5.0788
30 医药 8 0 5.3627
49 通信设备 4 0 4.9091
1
2
3
4
# num列的值排名其前3 ,index列值大于其平均值
nlg = nlargest(3,df['num'])
tj = df.eval('num in @nlg & index > index.mean()')
df.query('@tj')
type num strong index
3 化工 16 1 4.5868
4 半导体 10 0 5.1925
13 元器件 12 0 5.7186

比较运算符和逻辑运算符

1
2
3
4
df = pd.DataFrame(np.random.randint(100, size=(6, 6)),
columns=list("ABCDEF"),
index=range(1, 7))
df
A B C D E F
1 79 33 60 33 34 63
2 66 45 18 43 52 46
3 75 0 31 56 71 50
4 60 23 12 29 25 57
5 98 67 35 53 67 82
6 0 23 48 31 48 47
1
2
# 条件 A < B (A列值 < B列值) 并且B<C
df.query("A<B & B<C ")
A B C D E F
6 0 23 48 31 48 47
1
2
# 连续比较
df.query("A<B<C")
A B C D E F
6 0 23 48 31 48 47

类似于 isin / ~isin 的用法

1
2
3
4
5
lst = [i for i in range(100) if i%5==0]
df.query("A ==@lst & B== @lst")

# 等价于:
df[df["A"].isin(lst) & (df["B"].isin(lst))]
A B C D E F
3 75 0 31 56 71 50
A B C D E F
3 75 0 31 56 71 50
1
2
3
4
5
df.query("A ==@lst & F!= @lst")

# 等价于:
df[df["A"].isin(lst) & ~df["F"].isin(lst)]

A B C D E F
4 60 23 12 29 25 57
6 0 23 48 31 48 47
A B C D E F
4 60 23 12 29 25 57
6 0 23 48 31 48 47

类似于 in / not in

1
2
# A 列的值包含在 B 列 或 C 列中
df.query("A in B | A in C")
A B C D E F
4 60 23 12 29 25 57
6 0 23 48 31 48 47
1
2
# A 列的值不在 B 列中
df.query("A not in B")
A B C D E F
1 79 33 60 33 34 63
2 66 45 18 43 52 46
3 75 0 31 56 71 50
4 60 23 12 29 25 57
5 98 67 35 53 67 82
1
2
3
4
lst = [i for i in df['A'] if i%2==0]

# A 列的值不在 lst 中
df.query("A not in @lst")
A B C D E F
1 79 33 60 33 34 63
3 75 0 31 56 71 50
1
2
3
4
5
6
7
from heapq import nlargest,nsmallest

# A 列值前3 并且 B 列值前3
tj1 = nlargest(3,df.A)
tj2 = nlargest(3,df.B)

df.query("A in @tj & B in @tj2")
A B C D E F

布尔运算符 not~ 运算符否定布尔表达式

1
2
df["bools"] = df.eval("C> C.mean()")
df
A B C D E F bools
1 79 33 60 33 34 63 True
2 66 45 18 43 52 46 False
3 75 0 31 56 71 50 False
4 60 23 12 29 25 57 False
5 98 67 35 53 67 82 True
6 0 23 48 31 48 47 True
1
df.query("not bools")
A B C D E F bools
2 66 45 18 43 52 46 False
3 75 0 31 56 71 50 False
4 60 23 12 29 25 57 False
1
df.query("~bools")
A B C D E F bools
2 66 45 18 43 52 46 False
3 75 0 31 56 71 50 False
4 60 23 12 29 25 57 False
1
2
3
4
5
tj = df.eval("C> C.mean()")

# 条件成立
df.query("@tj")

A B C D E F bools
1 79 33 60 33 34 63 True
5 98 67 35 53 67 82 True
6 0 23 48 31 48 47 True
1
2
3
4
# 条件不成立
tj = df.eval("C> C.mean()")
df.query("~@tj")

A B C D E F bools
2 66 45 18 43 52 46 False
3 75 0 31 56 71 50 False
4 60 23 12 29 25 57 False
1
2
3
# 条件不成立
tj = df.eval("C> C.mean()")
df.query("not @tj")
A B C D E F bools
2 66 45 18 43 52 46 False
3 75 0 31 56 71 50 False
4 60 23 12 29 25 57 False

1
2
3
import pandas as pd
import random
import numpy as np
1
2
3
4
5
6
ar1 = np.random.randint(46, 99, size=20).reshape(4, 5)
lst1 = ["语文", "数学", "英语", "物理", "化学"]
lst2 = ["周明", "王鹏", "刘华", "罗宾"]

df = pd.DataFrame(ar1, index=lst2, columns=lst1)
df

out>>>>>

语文 数学 英语 物理 化学
周明 95 85 48 93 54
王鹏 72 50 50 80 47
刘华 96 67 60 80 97
罗宾 83 51 84 68 71

行列转置

1
df.T

out>>>>>

周明 王鹏 刘华 罗宾
语文 95 72 96 83
数学 85 50 67 51
英语 48 50 60 84
物理 93 80 80 68
化学 54 47 97 71

stack()

df.stack(level: 'Level' = -1, dropna: 'bool' = True)

  • 将指定级别从列堆叠到索引.将数据的列索引转换为行索引
  • stack和unstack默认操作为最内层,可以用level参数指定操作层
  • stack转换dataframe时,若只有一层列索引则转换后的类型为series,否则为dataframe
1
2
df.stack()
type(df.stack())

out>>>>>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

周明 语文 95
数学 85
英语 48
物理 93
化学 54
王鹏 语文 72
数学 50
英语 50
物理 80
化学 47
刘华 语文 96
数学 67
英语 60
物理 80
化学 97
罗宾 语文 83
数学 51
英语 84
物理 68
化学 71
dtype: int32
pandas.core.series.Series
1
2
df.stack().to_frame()
type(df.stack().to_frame())

out>>>>>

0
周明 语文 95
数学 85
英语 48
物理 93
化学 54
王鹏 语文 72
数学 50
英语 50
物理 80
化学 47
刘华 语文 96
数学 67
英语 60
物理 80
化学 97
罗宾 语文 83
数学 51
英语 84
物理 68
化学 71
1
pandas.core.frame.DataFrame

unstack()

1
df.stack().unstack()

out>>>>>

语文 数学 英语 物理 化学
周明 95 85 48 93 54
王鹏 72 50 50 80 47
刘华 96 67 60 80 97
罗宾 83 51 84 68 71
1
2
df.unstack()
type(df.unstack())

out>>>>>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

语文 周明 95
王鹏 72
刘华 96
罗宾 83
数学 周明 85
王鹏 50
刘华 67
罗宾 51
英语 周明 48
王鹏 50
刘华 60
罗宾 84
物理 周明 93
王鹏 80
刘华 80
罗宾 68
化学 周明 54
王鹏 47
刘华 97
罗宾 71
dtype: int32
pandas.core.series.Series
1
df.unstack().to_frame()

out>>>>>

0
语文 周明 95
王鹏 72
刘华 96
罗宾 83
数学 周明 85
王鹏 50
刘华 67
罗宾 51
英语 周明 48
王鹏 50
刘华 60
罗宾 84
物理 周明 93
王鹏 80
刘华 80
罗宾 68
化学 周明 54
王鹏 47
刘华 97
罗宾 71

1
2
3
from IPython.display import IFrame, Image
import os
import re
1
2
3
4
ph=os.getcwd()
webp_files=[x for x in os.listdir(ph) if re.search('.webp',x)]
for i in webp_files:
Image(i,width='300px')

output:

1
IFrame('./readme.pdf', width='1200', height='800px')

1
2
from datetime import date, datetime, timedelta
import pandas as pd

datetime_module

获取当前日期、时间

  • 详细时间
  • 简单时间
1
2
3
4
5
6
7
8
9
t = datetime.now()
t
type(t)
t.year
t.month
t.day
t.hour
t.minute
t.second

Output:

1
2
3
4
5
6
7
8
datetime.datetime(2022, 4, 5, 0, 41, 14, 961976)
datetime.datetime
2022
4
5
0
41
14
1
2
3
4
5
t = date.today()
t
t.year
t.month
t.day

Output:

1
2
3
4
datetime.date(2022, 4, 5)
2022
4
5

日期转星期

  • weekday Monday == 0 … Sunday == 6
  • isoweekday Monday == 1 … Sunday == 7
1
2
3
4
5
t = date.today()
datetime.isoweekday(t)

t = datetime.now()
datetime.weekday(t)

Output:

1
2
2
1
1
2
t = date(2022, 4, 4)
datetime.isoweekday(t)

Output:

1
1

字符串转与datetime格式转化

  • strptime() 传入 '2022/4/4' 斜杠的格式 >>>>>>datetime.datetime
  • datetime() 传入整型 年,月,日,时,分,秒 >>>>>> datetime.datetime
  • .strftime() 传入格式如 '%Y%m%d' 或者 '%Y-%m-%d' >>>>>>str
  • f-string方法,f'{datetime:'%Y%m%d'} >>>>>>>>>>>>str
    • 这种方法快捷,而且相当灵活,用法多样
    • %y 两位数的年份表示(00-99)
    • %Y 四位数的年份表示(000-9999)
    • %m 月份(01-12)
    • %d 月内中的一天(0-31)
    • %H 24小时制小时数(0-23)
    • %I 12小时制小时数(01-12)
    • %M 分钟数(00=59)
    • %S 秒(00-59)
    • %a 本地简化星期名称
    • %A 本地完整星期名称
    • %b 本地简化的月份名称
    • %B 本地完整的月份名称
    • %c 本地相应的日期表示和时间表示
    • %j 年内的一天(001-366)
    • %p 本地A.M.或P.M.的等价符
    • %U 一年中的星期数(00-53)星期天为星期的开始
    • %w 星期(0-6),星期天为星期的开始
    • %W 一年中的星期数(00-53)星期一为星期的开始
    • %x 本地相应的日期表示
    • %X 本地相应的时间表示
    • %Z 当前时区的名称
1
2
3
4
5
6
7
8
9
td = datetime.strptime('2022/4/4', '%Y/%m/%d')
type(td)

t = datetime(2022, 4, 4, 0, 0, 0)
type(t)

t.strftime('%Y%m%d')
t.strftime('%Y-%m-%d')
f'{t:%Y-%m-%d}'

Output:

1
2
3
4
5
datetime.datetime
datetime.datetime
'20220404'
'2022-04-04'
'2022-04-04'
1
2
3
4
5
6
7
8
t = datetime.now()
f'{t:%y}, {t:%Y}, {t:%m}, {t:%d}, {t:%H}, {t:%M}, {t:%S}'
f'{t:%a}, {t:%A}, {t:%b}, {t:%B}'
f'{t:%c}'
f'{t:%j}, {t:%p}'
f'{t:%U}, {t:%W}'
f'{t:%w}, {t:%x}, {t:%X}'
f'{t:%Z}'

Output:

1
2
3
4
5
6
7
'22,  2022,  04,  05,  00,  41,  15'
'Tue, Tuesday, Apr, April'
'Tue Apr 5 00:41:15 2022'
'095, AM'
'14, 14'
'2, 04/05/22, 00:41:15'
''
1
2
datetime.max
datetime.min

Output:

1
2
datetime.datetime(9999, 12, 31, 23, 59, 59, 999999)
datetime.datetime(1, 1, 1, 0, 0)
1
2
t = datetime.now()
datetime.timestamp(t)

Output:

1
1649090475.069974

pandas_module中的时间函数

  • pd.date_range() 列出期间的所有日期

    • Returns rng : DatetimeIndex
    • Of the four parameters start, end, periods, and freq,exactly three must be specified. If freq is omitted, the resulting,DatetimeIndex will have periods linearly spaced elements between start and end (closed on both sides).
    • start : str or datetime-like, optional, Left bound for generating dates.
    • end : str or datetime-like, optional, Right bound for generating dates.
    • periods : int, optional, Number of periods to generate.
    • freq : str or DateOffset, default ‘D’, Frequency strings can have multiples, e.g. ‘5H’. See
      :ref:here <timeseries.offset_aliases> for a list of frequency aliases.
  • pd.period_range()

    • Of the three parameters: start, end, and periods, exactly two must be specified.
    • start : str or period-like, default None,Left bound for generating periods.
    • end : str or period-like, default None,Right bound for generating periods.
    • periods : int, default None,Number of periods to generate.
    • freq : str or DateOffset, optional,Frequency alias. By default the freq is taken from start or end
      if those are Period objects. Otherwise, the default is "D" fordaily frequency.
    • name : str, default None, Name of the resulting PeriodIndex.must be specified.
  • pd.to_datetime()

  • pd.to_timedelta()

生成日期范围

= pd.date_range

  • pd.period_range
1
2
3
4
5
6
7
pd.date_range('2022-4-1', '2022-4-10')

pd.date_range('2022-4-1', periods=3)
pd.date_range(end='2022-4-1', periods=3)

pd.date_range('2022-4-1', periods=3, freq='M')
pd.date_range('2022-4-1', periods=3, freq='3M')

Output:

1
2
3
4
5
6
7
8
9
10
11
12
13
DatetimeIndex(['2022-04-01', '2022-04-02', '2022-04-03', '2022-04-04',
'2022-04-05', '2022-04-06', '2022-04-07', '2022-04-08',
'2022-04-09', '2022-04-10'],
dtype='datetime64[ns]', freq='D')


DatetimeIndex(['2022-04-01', '2022-04-02', '2022-04-03'], dtype='datetime64[ns]', freq='D')

DatetimeIndex(['2022-03-30', '2022-03-31', '2022-04-01'], dtype='datetime64[ns]', freq='D')

DatetimeIndex(['2022-04-30', '2022-05-31', '2022-06-30'], dtype='datetime64[ns]', freq='M')

DatetimeIndex(['2022-04-30', '2022-07-31', '2022-10-31'], dtype='datetime64[ns]', freq='3M')
1
2
pd.period_range('2022-4-13', '2022-8-1', freq='M')
pd.period_range('2022Q1', periods=3, freq='Q')

Output:

1
2
3
PeriodIndex(['2022-04', '2022-05', '2022-06', '2022-07', '2022-08'], dtype='period[M]')

PeriodIndex(['2022Q1', '2022Q2', '2022Q3'], dtype='period[Q-DEC]')

转换格式

  • datetime64[ns]
1
2
3
4
5
6
7
8
9
10
pd.to_datetime("2022-4-5")

pd.to_datetime(["2022-4-5", "2022-5-5"])
pd.to_datetime([1, 2, 3], unit='D', origin=pd.Timestamp('2022-05-21'))

pd.to_datetime([
'2018-10-26 12:00',
'2018-10-26 12:00 -0530',
datetime(2020, 1, 1, 18),
])

Output:

1
2
3
4
5
6
7
Timestamp('2022-04-05 00:00:00')

DatetimeIndex(['2022-04-05', '2022-05-05'], dtype='datetime64[ns]', freq=None)

DatetimeIndex(['2022-05-22', '2022-05-23', '2022-05-24'], dtype='datetime64[ns]', freq=None)

Index([2018-10-26 12:00:00, 2018-10-26 12:00:00-05:30, 2020-01-01 18:00:00], dtype='object')

python 的格式化输出 f-string

  • f-string格式化字符串。
  • 从%s格式化到format格式化再到f-string格式化,格式化的方式越来越直观,
  • f-string的效率也较前两个高一些,使用起来也比前两个简单一些。

基本使用

  • f-string用大括{ }表示被替换字段,其中直接填入替换内容即可。
1
2
3
from datetime import date, time, datetime
from chinese_calendar import is_workday
import pandas as pd
1
2
3
4
x, y = 9, 99

d = date.today()
f'今天是:{d},"x"={x},"y"={y}'

Output:
'今天是:2022-04-05,"x"=9,"y"=99'

表达式求值与函数调用

  • f-string的大括号{ }可以填入表达式或调用函数,Python会求出其结果并填入返回的字符串内。
  • f-string中使用lambda匿名函数:可以做复杂的数值计算,切记要将函数表达式和传参分别用小括号包含起来。
1
2
3
x = 9
y = 19
f'y/x整除:{y//9}, y/x的余数:{y%x}, y/x取两位小数:{y/x:.2f}, y/x取两位小数:{round(y/x,2) } , 数字y的科学计数:{y:e}'

Output:

'y/x整除:2,  y/x的余数:1, y/x取两位小数:2.11, y/x取两位小数:2.11 , 数字y的科学计数:1.900000e+01'
1
2
3
4
x = 9
y = 19
f'{(lambda a,b: a**2-b )(x,y):.2f}'
f'{(lambda x :"今天要上班" if is_workday(x) else "今天休息")(d) }'

Output:

'62.00'
'今天休息'

f-string中引号使用存在的问题

  • f-string大括号内使用的引号不能和大括号外的引号定界符引号冲突,需根据情况灵活切换使用单引号、双引号、单三引号、双三引号。
  • 只要大括号内外的引号不同,就没有问题。
  • 大括号中只能是单引号和 双引号 ,大括号外的引号定界符引号可以使用单引号、双引号、单三引号、双三引号。
  • 大括号外的引号还可以使用\转义,但大括号内不能使用\转义
1
f'今天是:{date.today()}{(lambda x :"今天要上班" if is_workday(x) else "今天是中国的节假日")(d) }'

Output:

'今天是:2022-04-05 周 今天是中国的节假日'
1
f'这里用到转义符,仅仅能在大括号外:I\'m number "{x}"'

Output:
‘这里用到转义符,仅仅能在大括号外:I'm number “9”‘

数字格式化

  • 正负号的使用
  • 宽度与精度相关格式描述符:保留小数点位数
  • 截断与填充的结合使用
  • 针对date、datetime和time对象,进行年月日、时分秒等信息提取
1
2
3
4
5
6
# -----正、负号 及空格------
x = 9
y = -99
f'正数前加“+”:{x :+},负数不改变:{y:+}'
f'正数无变化:{x:-},负数也无变化:{y:-} '
f'正数前增加空格:{x: }, 负数无变化:{y: }'

Output:

'正数前加“+”:+9,负数不改变:-99'
'正数无变化:9,负数也无变化:-99 '
'正数前增加空格: 9, 负数无变化:-99'
1
2
3
4
5
# -----数字格式化,数字精度-----
x = 99.1234
f'{x:g}, {x:.1g}, {x:.2g}, {x:.3g}'
f'{x:f}, {x:.1f}, {x:.2f}, {x:.3f}'
f'{x:e}, {x:.1e}, {x:.2e}, {x:.3e}'

Output:

1
2
3
'99.1234,  1e+02,  99,  99.1'
'99.123400, 99.1, 99.12, 99.123'
'9.912340e+01, 9.9e+01, 9.91e+01, 9.912e+01'
1
2
3
4
5
6
7
# -----宽度-----
# 宽度 ":"后面的整数表示占位多个个字符宽度,中文字符的宽度是特殊的
# 表示宽度的前面是0,则用0填充宽度
x, y = 99.12345, 'python'
f'{x:20}'
f'{y:20}'
f'{x:020}'

Output:

1
2
3
'            99.12345'
'python '
'00000000000099.12345'
1
2
3
4
5
6
7
8
# -----对齐方式, 占位符的填充-----
# >,<,^ 分别表示右对齐,左对齐,居中,数字默认右对齐,文本默认左对齐
x = 99.12345
y = 'python'
f'{x:<20}'
f'{y:^20}'
f'{x:-^20}'
f'{y:*>20}'

Output:

1
2
3
4
'99.12345            '
' python '
'------99.12345------'
'**************python'
1
2
3
4
# -----截断、和填充结合使用-----
y = 'python'
f'{y:.4}'
f'{y:10.5}'

Output:

1
2
'pyth'
'pytho '
1
2
3
4
5

# -----占位宽度和精度同时使用-----
x = 999.123
f'{x:<15.2f}'
f'{x:~^15.2f}'

Output:

1
2
'999.12         '
'~~~~999.12~~~~~'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# -----时间对象的格式化-----
# %Y,%m,%d: 年月日
# %H,%M,%S:时分秒
# %W,%w:本田度第几周,星期几
d = date.today()
d1 = datetime.now()
d, d1

# :%y-%m-%d
f"{d:%y-%m-%d},{d:%Y-%m-%d}"

# %Y:4位的年份,%y:2位的年份
f"{d:%Y},{d:%y}"

# %m:2位月份 %d:2位日期
f"{d:%m} {d:%d}"

# 分别表示时分秒
f"{d1:%H},{d1:%M},{d1:%S}"

# 第几周和星期几
f'{d:%W} {d:%w}'

Output:

1
2
3
4
5
6
(datetime.date(2022, 4, 5), datetime.datetime(2022, 4, 5, 16, 4, 46, 131598))
'22-04-05,2022-04-05'
'2022,22'
'04 05'
'16,04,46'
'14 2'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from chinese_calendar import workdays, utils, get_workdays, get_holidays, get_holiday_detail, is_workday

d1 = datetime.now()
wd = {
'星期一': 1,
'星期二': 2,
'星期三': 3,
'星期四': 4,
'星期五': 5,
'星期六': 6,
'星期日': 7,
}
a = int(f'{d1:%w}')
if get_holiday_detail(d)[0]:
b = "今天是:" + get_holiday_detail(d)[1]
else:
b = ""

print(f'''此时此刻:{d1};
{(lambda x: [k for k, v in wd.items() if v == x][0])(a)};
{(lambda x: "今天要上班" if is_workday(x) else "今天休假")(d1)};
{b}
今年的第 {d1:%W} 周;
{(d-date(2021, 12, 31)).days} 天;
''')

Output:

1
2
3
4
5
6
此时此刻:2022-04-05 16:04:46.148597; 
星期二;
今天休假;
今天是:Tomb-sweeping Day
今年的第 14 周;
第 95 天;

乘法表

1
2
3
4
for i in range(1, 10):
for j in range(1, i + 1):
print(f'{j}*{i}={i*j}', end="\t ")
print("\n")
1*1=1

1*2=2  2*2=4

1*3=3  2*3=6  3*3=9

1*4=4  2*4=8  3*4=12  4*4=16

1*5=5  2*5=10  3*5=15  4*5=20  5*5=25

1*6=6  2*6=12  3*6=18  4*6=24  5*6=30  6*6=36

1*7=7  2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49

1*8=8  2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64

1*9=9  2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81

两个堆积数字的示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def print_num1(x):
ls = [i for i in range(1, x, 1)]
sum(ls) * 2 + x
width = 4 * x + 10

ls1 = [f'{i:03}' for i in range(sum(ls) * 2 + x)]
m = 0
n = 1
for i in range(len(ls1)):
for n in range(1, x, 1):
a = " "
for j in ls1[m:m + n]:
a += (" " + j)
print(f'{a:^{width}}')
m = m + n
for n in range(x, 1, -1):
a = " "
for j in ls1[m:m + n]:
a += (" " + j)
print(f'{a:^{width}}')
m = m + n
1
print_num1(22)
000
001 002
003 004 005
006 007 008 009
010 011 012 013 014
015 016 017 018 019 020
021 022 023 024 025 026 027
028 029 030 031 032 033 034 035
036 037 038 039 040 041 042 043 044
045 046 047 048 049 050 051 052 053 054
055 056 057 058 059 060 061 062 063 064 065
066 067 068 069 070 071 072 073 074 075 076 077
078 079 080 081 082 083 084 085 086 087 088 089 090
091 092 093 094 095 096 097 098 099 100 101 102 103 104
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230
231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252
253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273
274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293
294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312
313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330
331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347
348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363
364 365 366 367 368 369 370 371 372 373 374 375 376 377 378
379 380 381 382 383 384 385 386 387 388 389 390 391 392
393 394 395 396 397 398 399 400 401 402 403 404 405
406 407 408 409 410 411 412 413 414 415 416 417
418 419 420 421 422 423 424 425 426 427 428
429 430 431 432 433 434 435 436 437 438
439 440 441 442 443 444 445 446 447
448 449 450 451 452 453 454 455
456 457 458 459 460 461 462
463 464 465 466 467 468
469 470 471 472 473
474 475 476 477
478 479 480
481 482
483
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def print_num2(x):
if x % 2 == 0:
x = x + 1
ls = [i for i in range(1, x, 2)]
sum(ls) * 2 + x
width = 4 * x + 10

ls1 = [f'{i:03}' for i in range(sum(ls) * 2 + x)]
m = 0
n = 1
for i in range(len(ls1)):
for n in range(1, x, 2):
a = " "
for j in ls1[m:m + n]:
a += (" " + j)
print(f'{a:>{width}}')
m = m + n
for n in range(x, 1, -2):
a = " "
for j in ls1[m:m + n]:
a += (" " + j)
print(f'{a:>{width}}')
m = m + n
1
print_num2(17)
000
                                                               001 002 003
                                                       004 005 006 007 008
                                               009 010 011 012 013 014 015
                                       016 017 018 019 020 021 022 023 024
                               025 026 027 028 029 030 031 032 033 034 035
                       036 037 038 039 040 041 042 043 044 045 046 047 048
               049 050 051 052 053 054 055 056 057 058 059 060 061 062 063
       064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080
               081 082 083 084 085 086 087 088 089 090 091 092 093 094 095
                       096 097 098 099 100 101 102 103 104 105 106 107 108
                               109 110 111 112 113 114 115 116 117 118 119
                                       120 121 122 123 124 125 126 127 128
                                               129 130 131 132 133 134 135
                                                       136 137 138 139 140
                                                               141 142 143
                                                                       144

pd.read_csv( )

1
2
import pandas as pd
import numpy as np

pd.read_csv( filepath_or_buffer: 'FilePath | ReadCsvBuffer[bytes] | ReadCsvBuffer[str]', sep=<no_default>, delimiter=None, header='infer', names=<no_default>, index_col=None, usecols=None, squeeze=None, prefix=<no_default>, mangle_dupe_cols=True, dtype: 'DtypeArg | None' = None, engine: 'CSVEngine | None' = None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, skipfooter=0, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=None, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, cache_dates=True, iterator=False, chunksize=None, compression: 'CompressionOptions' = 'infer', thousands=None, decimal: 'str' = '.', lineterminator=None, quotechar='"', quoting=0, doublequote=True, escapechar=None, comment=None, encoding=None, encoding_errors: 'str | None' = 'strict' , dialect=None, error_bad_lines=None, warn_bad_lines=None, on_bad_lines=None, delim_whitespace=False, low_memory=True, memory_map=False, float_precision=None, storage_options: 'StorageOptions' = None, )

读取CSV

  • csv(逗号分割)
    也支持文件的部分导入和选择迭代

filepath_or_buffer

  • 指定文件路径
  • 本地文件 D:\OneDrive\文档\Office\shid.csv
  • url(http\ftp)
1
pd.read_csv('dlt.csv').head()

Output:

Unnamed: 0 期号 R1 R2 R3 R4 R5 B1 B2 日期
0 0 21088 2 14 31 34 35 1 7 2021-08-02
1 1 21087 10 14 15 25 28 3 10 2021-07-31
2 2 21086 2 3 7 16 17 6 10 2021-07-28
3 3 21085 1 12 15 26 35 10 11 2021-07-26
4 4 21084 2 10 14 30 33 6 9 2021-07-24

sep : str,指定分隔符

  • default ‘,’
  • 如果不指定参数,则会尝试使用逗号分隔。
  • 分隔符长于一个字符并且不是‘\s+’,将使用python的语法分析器。并且忽略数据中的逗号。正则表达式例子:’\r\t’
1
pd.read_csv('dlt.csv',sep='\t').head()

Output:

,期号,R1,R2,R3,R4,R5,B1,B2,日期
0 0,21088,02,14,31,34,35,01,07,2021-08-02
1 1,21087,10,14,15,25,28,03,10,2021-07-31
2 2,21086,02,03,07,16,17,06,10,2021-07-28
3 3,21085,01,12,15,26,35,10,11,2021-07-26
4 4,21084,02,10,14,30,33,06,09,2021-07-24

index_col = None/0/False

  • 用第几列作为行索引
  • None :表示没有,自动添加数字序列作为索引
  • 0:指定第0列作为索引列
  • [0,1]: 也可以指定多列索引
1
pd.read_csv('dlt.csv', index_col=[0, 1]).head()

Output:

R1 R2 R3 R4 R5 B1 B2 日期
期号
0 21088 2 14 31 34 35 1 7 2021-08-02
1 21087 10 14 15 25 28 3 10 2021-07-31
2 21086 2 3 7 16 17 6 10 2021-07-28
3 21085 1 12 15 26 35 10 11 2021-07-26
4 21084 2 10 14 30 33 6 9 2021-07-24

header : int or list of ints

  • 指定数据框的列标签
  • default ‘infer’
  • None 会表明表中没有表头,自动添加数字序列的表头
  • 0 :表示使用表格中的首行作为标签
  • [0,1,2] 也可以是多行作为标题
  • 指定行数用来作为列名,数据开始行数。如果文件中没有列名,则默认为0,否则设置为None。
1
pd.read_csv('dlt.csv',index_col=0,header=None).head()

Output:

1 2 3 4 5 6 7 8 9
0
NaN 期号 R1 R2 R3 R4 R5 B1 B2 日期
0.0 21088 02 14 31 34 35 01 07 2021-08-02
1.0 21087 10 14 15 25 28 03 10 2021-07-31
2.0 21086 02 03 07 16 17 06 10 2021-07-28
3.0 21085 01 12 15 26 35 10 11 2021-07-26
1
pd.read_csv('dlt.csv', index_col=0, header=[0, 1, 2]).head()

Output:

期号 R1 R2 R3 R4 R5 B1 B2 日期
0 21088 02 14 31 34 35 01 07 2021-08-02
1 21087 10 14 15 25 28 03 10 2021-07-31
2 21086 2 3 7 16 17 6 10 2021-07-28
3 21085 1 12 15 26 35 10 11 2021-07-26
4 21084 2 10 14 30 33 6 9 2021-07-24
5 21083 7 9 11 26 35 1 8 2021-07-21
6 21082 1 14 22 29 33 3 10 2021-07-19

names= […] 更改列名称

  • 更改列名称
  • names=<no_default>
  • 数量要相同,
  • 列名称是一个序列
1
2
3
4
5
6
pd.read_csv(
'dlt.csv',
index_col=0,
header=0,
names=['期号', 'Red1', 'Red2', 'Red3', 'Red4', 'Red5', 'Blue1', 'Blue2',
'日期']).head()

Output:

期号 Red1 Red2 Red3 Red4 Red5 Blue1 Blue2 日期
0 21088 2 14 31 34 35 1 7 2021-08-02
1 21087 10 14 15 25 28 3 10 2021-07-31
2 21086 2 3 7 16 17 6 10 2021-07-28
3 21085 1 12 15 26 35 10 11 2021-07-26
4 21084 2 10 14 30 33 6 9 2021-07-24

usecols=None, 选取列

  • 要读入哪些列的数据,用列表表示
  • usecols=[0,1,...]
  • 当使用 usecols=[...] 参数时,要将 index_col =None
  • 也可以使用函数定义要读入哪些列,传入函数的变量是列标签
1
pd.read_csv('dlt.csv', index_col=None, header='infer', usecols=[1, 3, 5, 7, 9]).head()

Output:

期号 R2 R4 B1 日期
0 21088 14 34 1 2021-08-02
1 21087 14 25 3 2021-07-31
2 21086 3 16 6 2021-07-28
3 21085 12 26 10 2021-07-26
4 21084 10 30 6 2021-07-24
1
2
import  re
pd.read_csv('dlt.csv', index_col=None, header=0, usecols=lambda x: re.search("^B",x)).head()

Output:

B1 B2
0 1 7
1 3 10
2 6 10
3 10 11
4 6 9

dtype : 指定列的数据格式

  • default None
  • 用字典的格式指定多列
  • 每列数据的数据类型。例如 {‘a’: np.float64, ‘b’: np.int32}
  • dtype = {col1’: str ,’col2’: int32 ,’col3’ :
1
2
3
4
5
6
7
8
9
10
11
df1 = pd.read_csv('dlt.csv', index_col=0, header=[0])

df2 = pd.read_csv('dlt.csv',
index_col=0,
header=0,
dtype={
'期号': str,
'R2': int,
})
print('之前各列的数据格式:\n', df1.dtypes)
print('指定了dtype参数后各列的数据格式:\n', df2.dtypes)

Output:
<img src="./1.webp">

parse_dates 解析日期列

  • parse_dates=['col_date']
  • 指定某些列为时间类型,这个参数一般搭配date_parser使用。
    • date_parser:是用来配合parse_dates参数的,
    • 因为有的列虽然是日期,但没办法直接转化,需要我们指定一个解析格式:
1
2
3
4
5
6
7
8
9
10
11
df2 = pd.read_csv('dlt.csv',
index_col=0,
header=0,
dtype={
'期号': str,
'R2': np.int32,
},
parse_dates=['日期'])

print('之前各列的数据格式:\n', df1.dtypes)
print('指定了dtype参数后各列的数据格式:\n', df2.dtypes)

Output:
<img src="./2.webp">

converters : dict

  • default None 列转换函数的字典。key可以是列名或者列的序号。
  • 可以转换数据格式,也可以使用函数运算
1
2
3
4
5
6
7
8
9
10
11
12
pd.read_csv('dlt.csv',
index_col=0,
header=0,
dtype={
'期号': str,
'Red2': int,
},
parse_dates=['日期'],
converters={
'R5': float,
'R1': lambda x: str(x).rjust(3, "0")
}).head()

Output:

期号 R1 R2 R3 R4 R5 B1 B2 日期
0 21088 002 14 31 34 35.0 1 7 2021-08-02
1 21087 010 14 15 25 28.0 3 10 2021-07-31
2 21086 002 3 7 16 17.0 6 10 2021-07-28
3 21085 001 12 15 26 35.0 10 11 2021-07-26
4 21084 002 10 14 30 33.0 6 9 2021-07-24

nrows : int

  • default None
  • 需要读取的行数(从文件头开始算起)。
1
2
3
4
5
6
7
8
9
10
11
12
13
pd.read_csv('dlt.csv',
index_col=0,
header=0,
dtype={
'期号': str,
'Red2': int,
},
parse_dates=['日期'],
converters={
'R5': float,
'R1': lambda x: str(x).rjust(3, "0")
},
nrows=8)

Output:

期号 R1 R2 R3 R4 R5 B1 B2 日期
0 21088 002 14 31 34 35.0 1 7 2021-08-02
1 21087 010 14 15 25 28.0 3 10 2021-07-31
2 21086 002 3 7 16 17.0 6 10 2021-07-28
3 21085 001 12 15 26 35.0 10 11 2021-07-26
4 21084 002 10 14 30 33.0 6 9 2021-07-24
5 21083 007 9 11 26 35.0 1 8 2021-07-21
6 21082 001 14 22 29 33.0 3 10 2021-07-19
7 21081 005 13 24 29 35.0 7 8 2021-07-17

skip_blank_lines : 对空行的处理

  • boolean, default True
  • 如果为True,则跳过空行;否则记为NaN。

skiprows : list-like or integer

  • default None 需要忽略的行数(从文件开始处算起),或需要跳过的行号列表(从0开始)。
  • 注意不要将表头给过滤掉
  • skipfooter : int, default 0 从文件尾部开始忽略。 (c引擎不支持)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
pd.read_csv('dlt.csv',
index_col=0,
header=0,
dtype={
'期号': str,
'Red2': int,
},
parse_dates=['日期'],
converters={
'R5': float,
'R1': lambda x: str(x).rjust(3, "0")
},
nrows=8,
skiprows=lambda x: x > 0 and x % 2 == 0)

Output:

期号 R1 R2 R3 R4 R5 B1 B2 日期
0 21088 002 14 31 34 35.0 1 7 2021-08-02
2 21086 002 3 7 16 17.0 6 10 2021-07-28
4 21084 002 10 14 30 33.0 6 9 2021-07-24
6 21082 001 14 22 29 33.0 3 10 2021-07-19
8 21080 015 16 20 29 30.0 6 10 2021-07-14
10 21078 002 8 17 19 25.0 1 5 2021-07-10
12 21076 006 13 22 25 26.0 2 4 2021-07-05
14 21074 011 14 18 20 25.0 3 7 2021-06-30

engine : 指定解析数据的引擎

  • {‘c’, ‘python’} 两种选择
  • 使用的分析引擎。可以选择C或者是python。C引擎快但是Python引擎功能更加完备。

encoding : 指定字符集类型

  • gbk,ansi,utf-8-sig,
  • 通常指定为’utf-8’.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
pd.read_csv('dlt.csv',
index_col=0,
header=0,
dtype={
'期号': str,
'R2': float,
},
parse_dates=['日期'],
converters={
'R5': float,
'R1': lambda x: str(x).rjust(2, "0")
},
nrows=8,
skiprows=lambda x: x > 0 and x % 2 == 0,
encoding='utf-8-sig',
engine='c')

Output:

期号 R1 R2 R3 R4 R5 B1 B2 日期
0 21088 02 14.0 31 34 35.0 1 7 2021-08-02
2 21086 02 3.0 7 16 17.0 6 10 2021-07-28
4 21084 02 10.0 14 30 33.0 6 9 2021-07-24
6 21082 01 14.0 22 29 33.0 3 10 2021-07-19
8 21080 15 16.0 20 29 30.0 6 10 2021-07-14
10 21078 02 8.0 17 19 25.0 1 5 2021-07-10
12 21076 06 13.0 22 25 26.0 2 4 2021-07-05
14 21074 11 14.0 18 20 25.0 3 7 2021-06-30