高质量编码--使用Pandas查询日期文件名中的数据

如下场景:数据按照日期保存为文件夹,文件夹中数据又按照分钟保存为csv文件。

日期格式文件夹名称
分钟格式文件名称
csv文件中的数据

2019-07-28文件夹和2019-07-29中的文件分别如下:

2019-07-28_15-25表示15时25分钟的数据

代码如下,其中subDirTimeFormat,fileTimeFormat,requestTimeFormat分别来指定文件夹解析格式,文件解析格式,以及查询参数日期解析格式:

import os
import pandas as pd

onedayDelta=pd.datetime(2018,9,2)-pd.datetime(2018,9,1)
baseDir="D:/Data"
subDirTimeFormat="%Y-%m-%d"
fileTimeFormat="%Y-%m-%d_%H-%M.csv"

requestTimeFormat="%Y-%m-%d %H:%M"


subDirs=os.listdir(baseDir)

def getData(startTime,endTime,featureID,featureField,resultFields):
    startTime=pd.datetime.strptime(startTime,requestTimeFormat)
    endTime=pd.datetime.strptime(endTime,requestTimeFormat)
    days=(endTime.date()-startTime.date()).days
    print(days)
    dates=list(map(lambda x:pd.datetime.strftime(startTime+onedayDelta*x,subDirTimeFormat),range(days+1)))
    dates=list(filter(lambda x:x in subDirs,dates))
    files=list(map(lambda x:map(lambda y:os.path.join(baseDir,x,y),os.listdir(os.path.join(baseDir,x))),dates))
    
    files=pd.DataFrame(files).values.flatten()
    
    fileNames=map(lambda x:os.path.basename(x),files)
    dfs=list(map(lambda x:pd.read_csv(x),files))
    
    for i,j in zip(dfs,fileNames):
        i['datetime']=pd.datetime.strptime(j,fileTimeFormat)
        i['datetimeTxt']=pd.datetime.strptime(j,fileTimeFormat).strftime(requestTimeFormat)
    if(len(dfs)==0):
        return {}
    
    df=pd.concat(dfs)
    df=df.set_index([featureField,'datetime']).sort_index()
    if not df.index.contains(featureID):
        return {}
    result=df.loc[featureID].loc[startTime:endTime].reset_index()[['datetimeTxt']+resultFields].to_json()
    return result 
if __name__=='__main__':
    
    result=getData('2019-07-28 05:29','2019-07-29 17:29',12,"name",["value1","value2"])
    print(result)

让我们查询2019-07-28 05:29到2019-07-29 17:29之间name为12的数据,只返回value1和value2列。看一下调用结果:

查询结果

通过比较检验,确认返回结果和csv文件中的数据是一致的,

name为12在各个csv中数据如下:

2019-07-28 15:25时刻对应value1和value2分别为12,2507
2019-07-28 16:25时刻对应value1和value2分别为181,1425
2019-07-29 12:45时刻对应value1和value2分别为104,2724
2019-07-29 12:55时刻对应value1和value2分别为147,2416

函数可以指定主键字段以及返回列作为参数,使其更有通用性和扩展性。

最后用Tornado封装成web接口,代码如下:

# -*- coding:utf-8 -*
import os
import json
from datetime import datetime
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define,options
from DataTools import getData ,onedayDelta,requestTimeFormat
define('port',default=8091,help='run on the given port',type=int)


class csvAPIHandler(tornado.web.RequestHandler):
    def get(self):
        startTime=self.get_argument('start',(datetime.now()-onedayDelta).strftime("%Y-%m-%d %H:%M"))
        endTime=self.get_argument('end',datetime.now().strftime("%Y-%m-%d %H:%M"))
        rowID=self.get_argument('id','9999')
        if rowID.isdigit():
            rowID=int(rowID)
        rowKey=self.get_argument('key','name')
        resultCols=self.get_argument('cols','["value1","value2"]')
        resultCols=json.loads(resultCols)
        print(startTime)
        print(endTime)
        print(rowID)
        print(rowKey)
        print(resultCols)
        
        result=getData(startTime,endTime,rowID,rowKey,resultCols)

     
        self.write(result)



if __name__=='__main__':
    tornado.options.parse_command_line()
    app=tornado.web.Application(
        handlers=[
		(r'/csvAPI',csvAPIHandler),
                  ],
        template_path=os.path.join(os.path.curdir,'templates'),static_path=os.path.join(os.path.curdir,'static'),cookie_secret='miaojiyue',debug=True )
         
    http_server=tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

查询id为12的数据
只返回value2列

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏明丰随笔

运行时序列化 2

使用这些特性是基于反射技术完成的,性能有一点损伤。还有在极少数的情况下,这些特性不能提供你想要的全部控制。你的类型通过实现ISerializable接口,也能支...

8320
来自专栏Happy的分享

为什么我强烈推荐你用枚举来实现单例模式

单例模式是 Java 中最简单,也是最基础,最常用的设计模式之一。在运行期间,保证某个类只创建一个实例,保证一个类仅有一个实例,并提供一个访问它的全局访问点。下...

42730
来自专栏7DGroup

性能基础之常见RPC框架浅析

在性能基础之浅谈常见接口性能压测一文中我们有简单介绍常见的 RPC 接口,本文将单篇详细介绍 RPC 框架。

18340
来自专栏明丰随笔

运行时序列化 1

2. 把对象图的转成字节流之后,可以通过网络传输到远程机器,远程机器可以还原对象图信息。

8320
来自专栏7DGroup

走进Java接口测试之fastjson指南

在上文 走进Java接口测试之理解JSON和XML基础 我们介绍了 JSON 的基础知识,本文我们深入研究阿里巴巴的开源 JSON 解析库 fastjson。

19420
来自专栏萝卜大杂烩

把英雄分类,看 Python 带你上王者

王者荣耀这么久了,还没上王者?哈哈哈,看过来,是不是对英雄理解的不够透彻呢,是不是还没有很好的为英雄分类呢,今天就来看看英雄分类

7420
来自专栏用户5637037的专栏

逻辑条件句、监督和选择任务

原文标题:Logic Conditionals, Supervenience, and Selection Tasks

8950
来自专栏明丰随笔

运行时序列化 3

1. 单实例类型(singleton),对于这种类型对象的序列化和反序列不应该在AppDomain中创建新的对象,应该使用已经存在的单实例对象。

11120
来自专栏FreeBuf

漏洞预警丨Fastjson远程代码执行漏洞

Fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到...

18730
来自专栏用户4838056的专栏

将视频压缩到最小,使用这个方法很简单

  怎样将视频压缩到最小?视频文件太大的话在传输的过程中会很浪费时间,遇到这种情况我们可以直接将视频先进行压缩,很多小伙伴可能都不知道压缩的方法,下面给大家讲解...

61650

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励