我有一个名为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个文件。那么如何才能使我的代码更加健壮和高效呢?
有任何帮助吗?谢谢
答案 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()