在Python中每小时生成多个CSV文件

时间:2014-07-25 06:14:01

标签: python csv

我有一个名为HourlyCsvGeneration.py的python模块。我有一些每小时生成的数据,即sample.txt。以下是sample.txt中数据的示例: -

2014-07-24 15:00:00,1,1,1,1,1001
2014-07-24 15:01:00,1,1,1,1,1001
2014-07-24 15:02:00,1,1,1,1,1001
2014-07-24 15:15:00,1,1,1,1,1001
2014-07-24 15:16:00,1,1,1,1,1001
2014-07-24 15:17:00,1,1,1,1,1001
2014-07-24 15:30:00,1,1,1,1,1001
2014-07-24 15:31:00,1,1,1,1,1001
2014-07-24 15:32:00,1,1,1,1,1001
2014-07-24 15:45:00,1,1,1,1,1001
2014-07-24 15:46:00,1,1,1,1,1001
2014-07-24 15:47:00,1,1,1,1,1001

如您所见,有4个区间00-15,15-30,30,45和45-59,下一个小时开始,依此类推。我正在编写将读取此txt文件中的数据并在一天中每小时生成4个CSV文件的代码。因此,分析上述数据应生成的4个CSV文件应具有命名约定,如2014-07-24 15:00.csv,其中包含15:00到15:15,2014-07-24 15:15.csv之间的数据15:15到15:30之间的数据,依此类推。 python代码必须处理所有这些。

这是我目前的代码段: -

import csv
def connection():
    fo = open("sample.txt", "r")
    data = fo.readlines()
    header = ['tech', 'band', 'region', 'market', 'code']
    for line in data:
            line = line.strip("\n")
            line = line.split(",")
            time = line[0]
            lines = [x for x in time.split(':') if x]
            i = len(lines)
            if i == 0:
                    continue
            else:
                    hour, minute, sec = lines[0], lines[1], lines[2]
                    minute = int(minute)
                    if minute >= 0 and minute < 15:
                            print hour, minute
                            print line[1:]
                    elif minute >= 15 and minute < 30:
                            print hour, minute
                            print line[1:]
                    elif minute >= 30 and minute < 45:
                            print hour, minute
                            print line[1:]
                    elif minute >=45 and minute < 59:
                            print hour, minute
                            print line[1:]
connection()

[1:]为每个间隔提供正确的数据,我在生成CSV文件和写入数据时感到很不舒服。因此,不是打印[1:],而是希望使用适当的命名约定在该时间间隔的csv文件中编写,如上面的描述中所述。

预期产出: -

2014-07-24 15:00.csv must contain
1,1,1,1,1001
1,1,1,1,1001
1,1,1,1,1001

2014-07-24 15:15.csv must contain
1,1,1,1,1001
1,1,1,1,1001
1,1,1,1,1001

以及15.30.csv和15.45.csv等。请记住,这只是一小部分数据。实际数据是每小时的数据。这意味着每小时生成4个csv文件,即一天24 * 4个文件。那么如何才能使我的代码更加健壮和高效呢?

有任何帮助吗?谢谢

4 个答案:

答案 0 :(得分:0)

您的问题并非易事,因为如果您尝试一次打开所有输出文件,那么您将耗尽文件描述符并崩溃。所以你要做的是在附加模式下打开一个文件,写一行,然后关闭文件。这不是一个非常有效的操作,所以我不担心效率。

outfile = open("2014-07-24 15:00.csv","a")
outfile.write("csv, line, data\n")
outfile.close()

答案 1 :(得分:0)

以下是一些可能有用的方法

import csv
from datetime import datetime

def get_higher_minute(minute_of_day):
    return (((minute_of_day/ 15) + 1 ) % 4) * 15

def connection():
    import csv
    with open('some.csv', 'rb') as f:
        reader = csv.reader(f)
        for row in reader:
            dateObject = datetime.strptime(row[0], '%Y-%m-%d %H:%M:%S')
            minute_of_day = dateObject.minute
            higher_minute = get_higher_minute(minute_of_day)
            newdate = dateObject.replace(minute = higher_minute)
            file_name_of_new_csv = "%s.csv" % dateObject.strftime("%Y-%m-%d %H:%M")
            new_csv_writer = csv.writer(file_name_of_new_csv, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL)
            new_csv_writer.writerow(row[0:])
            new_csv_writer.close()            

def main():
    connection()

if __name__=="__main__":
    main()

希望有所帮助

对不起。将new_csv_writer打开。

答案 2 :(得分:0)

我建议使用pandas。它会为你完成一大堆肮脏的工作。

import pandas as pd

df = pd.read_table('DummyText.txt',sep=',',index_col=0,parse_dates=True,header=None)
fname = (str(pd.datetime(2014,7,24,15,0))+'.csv').replace(':','-')
df[pd.datetime(2014,7,24,15,0):pd.datetime(2014,7,24,15,15)].to_csv(fname,header=None)

我从文件名中取出了:。它似乎不喜欢那样。 您需要做的就是设置一些循环来循环显示日期和时间。

答案 3 :(得分:0)

如果时间戳的值严格增加,似乎就像itertools.groupby的工作一样:

from datetime import datetime as DateTime
from itertools import imap, groupby
from operator import itemgetter


get_first = itemgetter(0)
get_second = itemgetter(1)


def process_line(line):
    timestamp_string, _, values = line.partition(',')
    timestamp = DateTime.strptime(timestamp_string, '%Y-%m-%d %H:%M:%S')
    return (
        timestamp.replace(minute=timestamp.minute // 15 * 15, second=0),
        values
    )


def main():
    with open('sample.txt', 'r') as lines:
        for date, group in groupby(imap(process_line, lines), get_first):
            with open('{0:%Y-%m-%d %H_%M}.csv'.format(date), 'w') as out_file:
                out_file.writelines(imap(get_second, group))


if __name__ == '__main__':
    main()