我有一个huuge csv文件(524 MB,记事本打开它4分钟)我需要更改格式化。现在就是这样:
1315922016 5.800000000000 1.000000000000 1315922024 5.830000000000 3.000000000000 1315922029 5.900000000000 1.000000000000 1315922034 6.000000000000 20.000000000000 1315924373 5.950000000000 12.452100000000
线条被换行符号分隔,当我将其粘贴到Excel中时,它会分成几行。我会通过使用Excel函数来完成它,但文件太大而无法打开。 第一个值是自1-01-1970以来的秒数,第二个是价格,第三个是自愿。
我需要它像这样:
01-01-2009 13:55:59 5.800000000000 1.000000000000 01-01-2009 13:56:00 5.830000000000 3.000000000000
等
记录需要用空格分隔。有时,同一秒的价格有多个价值,如下所示:
1328031552 6.100000000000 2.000000000000
1328031553 6.110000000000 0.342951630000
1328031553 6.110000000000 0.527604200000
1328031553 6.110000000000 0.876088370000
1328031553 6.110000000000 0.971026920000
1328031553 6.100000000000 0.965781090000
1328031589 6.150000000000 0.918752490000
1328031589 6.150000000000 0.940974100000
当发生这种情况时,我需要代码从该秒开始取平均价格并且每秒只保存一个价格。 这些比特币交易在BTC开始时并非每秒都发生。 如果没有来自某个秒的记录,则需要创建一个具有以下秒的新记录,并且从最后已知的价格和体积中复制价格和体积的值。
然后将所有内容保存到新的txt文件中。
我似乎无法做到这一点,我一直试图在python中编写一个转换器几个小时,请帮忙。
答案 0 :(得分:1)
shlex
是一个词法分析器。我们使用它一次从输入中选择数字。函数records
将这些组合成列表,其中列表的第一个元素是整数,其他元素是浮点。
循环读取records
的结果,并根据需要按时间平均。它还会将两个输出打印到一行。
from shlex import shlex
lexer = shlex(instream=open('temp.txt'), posix=False)
lexer.wordchars = r'0123456789.\n'
lexer.whitespace = ' \n'
lexer.whitespace_split = True
import time
def Records():
record = []
while True:
token = lexer.get_token()
if token:
token = token.strip()
if token:
record.append(token)
if len(record)==3:
record[0] = int(record[0])
record[1] = float(record[1])
record[2] = float(record[2])
yield record
record=[]
else:
break
else:
break
def conv_time(t):
return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(t))
records = Records()
pos = 1
current_date, price, volume = next(records)
price_sum = price
volume_sum = volume
count = 1
for raw_date, price, volume in records:
if raw_date == current_date:
price_sum += price
volume_sum += volume
count += 1
else:
print (conv_time(current_date), price_sum/count, volume_sum/count, end=' ' if pos else '\n')
pos = (pos+1)%2
current_date = raw_date
price_sum = price
volume_sum = volume
count = 1
print (conv_time(current_date), price_sum/count, volume_sum/count, end=' ' if pos else '\n')
以下是结果。您可能需要对小数点权限的有效数字执行某些操作。
2011-09-13 09:53:36 5.8 1.0 2011-09-13 09:53:44 5.83 3.0
2011-09-13 09:53:49 5.9 1.0 2011-09-13 09:53:54 6.0 20.0
2011-09-13 10:32:53 5.95 12.4521 2012-01-31 12:39:12 6.1 2.0
2012-01-31 12:39:13 6.108 0.736690442 2012-01-31 12:39:49 6.15 0.9298632950000001
答案 1 :(得分:0)
1)从文件中读取一行
data = {}
with open(<path to file>) as fh:
while True:
line = fh.readline()[:-1]
if not line: break
values = line.split(' ')
for n in range(0, len(values), 3):
dt, price, volumen = values[n:n+3]
2)检查最后一条记录之后的下一秒钟是否为 如果是这样,将价格和体积值添加到变量并增加计数器以便稍后用于计算平均值 3)如果第二个不是下一秒,则复制最后价格和体积的值。
if not dt in data:
data[dt] = []
data[dt].append((price, volumen))
4)划分时间戳,如&#34; 1328031552&#34;分为秒,分钟,小时,天,月,年 以某种方式照顾差距年。
for dt in data:
# seconds, minutes, hours, days, months, years = datetime (dt)
...以后用于计算平均值
p_sum, v_sum = 0
for p, v in data[dt]:
p_sum += p
v_sum += v
n = len(data[dt])
price = p_sum / n
volumen = v_sum / n
5)在01-01-2009 13:55:59 1586.12 220000命令中安排值 6)将记录添加到新数据库文件的末尾。
print(datetime, price, volumen)