1、读取文件并按时间顺序排序:
对于这个问题我整理了两种思路:
方法一
首先打开文件:
t_date = open('testdata.txt', 'r').read()
(因为之前生成的txt文件的保存格式为字符串)其格式如下所示:
`20/03/2016 13:38:50
05/07/2001 19:14:18
…
11/06/2003 10:05:57
19/10/2015 13:56:11`
这个问题的重点在与对时间数据进行排序,而文件中的数据是字符串形式,若要按照时间顺序进行排序比较,首先要对时间数据进行类型转换,即将字符串类型转换为时间日期类型数据:
时间日期数据格式化方法:
date_time = datetime.datetime.strptime(datetimes,"%Y-%m-%d %H:%M:%S")
需注意的是利用此方法进行类型转换时,datetime.datetime.strptime(a,b)
参数a,b的格式应一一对应;例如:“2003-11-02 10:05:57”>>"%Y-%m-%d %H:%M:%S"
当通过循环遍历把文件中所有数据转换为时间类型数据后,可以采用列表排序方法对数据进行排序:lt.sort()
该方法完整代码如下:
def sort_date1():
t_date = open('testdata.txt', 'r').read()
l_date = t_date.splitlines()
ld = []
for dt in l_date:
d1 = dt.split(' ')
d2 = d1[0].split('/')
d3 = d1[1]
d4 = d2[2] + '-' + d2[1] + '-' + d2[0]
datetimes = d4 + ' ' + d3
date_time = datetime.datetime.strptime(datetimes,"%Y-%m-%d %H:%M:%S")
# print(date_time)
ld.append(date_time)
ld.sort(reverse=True)
with open('t.txt','w')as p:
for d in ld:
p.write(str(d))
方法二
取数据的方法与以上相同,区别在于所用到的排序方法;当把数据取出后把数据写入csv文件,形成字典样式的文件;再通过pandas库进行读数据,进行排序操作;该方法不需要对数据进行日期数据格式化操作;
dts = pd.read_csv('date_time.csv')
dts['datetimes'].sort_values(ascending=False)
具体代码如下:
def sort_date2():
t_date = open('testdata.txt','r').read()
l_date = t_date.splitlines()
if not os.path.exists('date_time.csv'):
with open('date_time.csv','w') as fp:
fp.write('datetimes'+'\n')
for dt in l_date:
d1 = dt.split(' ')
d2 = d1[0].split('/')
d3 = d1[1]
d4 = d2[2]+'-'+d2[1]+'-'+d2[0]
datetimes = d4 + ' '+d3
fp.write(datetimes + '\n')
dts = pd.read_csv('date_time.csv')
#该方法进行排序时需对‘ascending’参数进行设置,默认为True;与列表类型的'reverse'相对
print(dts['datetimes'].sort_values(ascending=False))
2、取出2005–2015年的数据,存入excel表格中:
本题即筛选数据并写入excel文件,无非是读取数据循环遍历并通过一系列字符串操作取出年份数据进行判断即可;
代码如下:
def find_data():
data_info = open('testdata.txt','r').read()
l_data = data_info.split('\n')
fp = open('l_data.csv','w')
for i in l_data:
r = i.split(' ')
rs = int(r[0].split('/')[-1])
if rs >= 2005 and rs <= 2015:
# if (rs % 4 == 0) and (rs % 100 != 0) or rs % 400 ==0:
fp.write(i+'\n')
fp.close()
3、对上题生成的数据中的闰年闰月的数据高亮显示
本题旨在判断数据并对字体格式进行操作,并保存到 ‘xls’ 文件中;
该题涉及到对execl文件的操作,是之前未曾遇到的,所以借此题目对python语言中对execl文件的操作进行一个总结;对excel表的操作可分为写入操作以及读取操作;本题涉及到写入Excel表的操作。
首先python写入Excel表需要安装 ‘xlwt’ 模块:pip install xlwt
1、导入模块
import xlwt
2、创建workbook(其实就是excel,后来保存一下就行)
wb = xlwt.Workbook(encoding = 'ascii')
3、创建表
sheet1 = wb.add_sheet('My Worksheet')
4、往单元格内写入内容
sheet1.write(0, 0, label = 'Row 0, Column 0 Value',字体样式)
5、保存
wb.save('Excel_Workbook.xls')
以下为本题代码:
def test1():
r_data = xlwt.Workbook(encoding='utf8')
sheet1 = r_data.add_sheet (u'sheet1', cell_overwrite_ok=True)
# 生成第一行
data_info = open('l_data.csv','r').read()
l_data = data_info.split('\n')
default = change_font(5)
for i in range(30000):
print(i)
# 参数对应:行,列,值,字体样式(可以没有)
r = l_data[i].split(' ')
rs = int(r[0].split('/')[-1])
if (rs % 4 == 0) and (rs % 100 != 0) or rs % 400 == 0:
sheet1.write(i,0,l_data[i],default)
else:
sheet1.write(i, 0, l_data[i])
m = 0
sheet2 = r_data.add_sheet(u'sheet2', cell_overwrite_ok=True)
for j in range(30000,len(l_data)):
print(j)
# 参数对应:行,列,值,style(可以没有)
r = l_data[j].split(' ')
rs = int(r[0].split('/')[-1])
if (rs % 4 == 0) and (rs % 100 != 0) or rs % 400 == 0:
sheet2.write(m, 0,l_data[j],default)
else:
sheet2.write(m, 0,l_data[j])
m = m + 1
r_data.save('r_data.xls')
return 0
在操作过程中发现了几点问题;特在此强调一下,excel表中的每个sheet都可容纳数据行数为65535,倘若写入的数据量大于该值,应当建立多个sheet进行写入操作;
题中要求特殊数据的字体颜色设为高亮>那就对sheet.write()
方法添加相关参数;该方法用四个参数值:分别是行数、列数、写入内容、字体样式;
字体样式的实现方法为:
def change_font(color):
style = xlwt.XFStyle()
font = xlwt.Font()
font.colour_index = color
style.font = font
return style
另附: 读取excel表的操作
一、读excel表
读excel要用到xlrd模块,官网安装(http://pypi.python.org/pypi/xlrd)。然后就可以跟着里面的例子稍微试一下就知道怎么用了。大概的流程是这样的:
1、导入模块
import xlrd
2、打开Excel文件读取数据
data = xlrd.open_workbook(‘excel.xls’)
3、获取一个工作表
1 table = data.sheets()[0] #通过索引顺序获取
2 table = data.sheet_by_index(0) #通过索引顺序获取
3 table = data.sheet_by_name(u’Sheet1’)#通过名称获取
4、获取整行和整列的值(返回数组)
table.row_values(i)
table.col_values(i)
5、获取行数和列数
table.nrows
table.ncols
6、获取单元格
table.cell(0,0).value
table.cell(2,3).value
2.1、该问题即是对500万条数据进行的排序问题:
之前上边的问题也有提到过怎么对生成的字符串类型的时间数据转换成日期时间格式的时间数据,日期格式数据是可以进行大小比较的;所以对这个问题提供两种解题思路:
第一种:对生成的500万条数据进行排序操作(可参考上图中的第一题),因为要求取出时间最近的1000条数据,所以倘若是升序排序的话就取出前1000条,降序的话就取后1000条数据;
第二种:不需要对整体的数据进行排序操作,取出1000条数据,通过循环遍历比较取出的数据中的最最小的那个与剩余的499.9万条数据的一个比较,其实现代码如下:
def max_data():
# 比较大小
data_lt = open('testdata.txt','r').read().split('\n')
d_lt = []
for d in data_lt:
d1 = d.split(' ')[0].split('/')
d2 = d1[2] + '-' + d1[1] + '-' + d1[0]
d3 = d2 + ' ' + d.split(' ')[1]
dt = datetime.datetime.strptime(d3,"%Y-%m-%d %H:%M:%S")
if len(d_lt) <= 1000:
d_lt.append(dt)
else:
min_date = min(d_lt)
# print(min_date)
if min_date < dt:
d_lt.remove(min_date)
d_lt.append(dt)
return d_lt