我有一个csv文件,如下所示:
19/04/2015 00:00 180 187 85 162 608 61
19/04/2015 01:00 202 20 26 70 171 61
19/04/2015 02:00 20 40 40 11 40 810
19/04/2015 03:00 20 80 81 24 0 86
19/04/2015 04:00 25 30 70 91 07 50
19/04/2015 05:00 80 611 691 70 790 37
19/04/2015 06:00 199 69 706 70 790 171
19/04/2015 07:00 80 81 90 192 57 254
19/04/2015 08:00 40 152 454 259 52 151
每行都在文件的同一个单元格中。
我试图让它看起来像这样:
19/04/2015 00:00 180
19/04/2015 00:10 187
19/04/2015 00:20 85
19/04/2015 00:30 162
19/04/2015 00:40 608
19/04/2015 00:50 61
19/04/2015 01:00 202
等。
释:
第一个数字列表是日期dd/M/YYYY HH:mm
,其中包含6个值,每个值每10分钟。
在第二个演示文稿中,我希望每个值的日期都包含准确的时间和分钟。
这是我到目前为止所尝试的内容:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys, getopt
import tarfile
import re
import pandas as pd
import tempfile
import shutil
import collections
import urllib
import numpy
import logging
import csv
csvFile = "testfile.csv"
data = []
minutes = ['00:00','10:00','20:00','30:00','40:00','50:00']
with open(csvFile, 'rb') as csvfile:
reader = csv.reader(csvfile, delimiter=',')
for row in reader:
row[0] = re.sub("\s+", ";", row[0].strip())
rowlist = row[0].split(';')
while(len(rowlist)<8):
rowlist.append(0)
for i in range(len(rowlist)):
for m in minutes:
data.append(rowlist[0]+rowlist[1]+m)
data.append(rowlist[i])
df = pd.DataFrame(data)
df.to_csv('example.csv')
但是这段代码没有给我预期的结果。 有什么建议吗?
答案 0 :(得分:2)
好的,我将在这个中解释很多。
如果您打算处理日期,我强烈建议您使用datetime
个对象。因为这正是他们最初的原因所在。将它们转换为datetime对象,你可以进行大量的操作。
这是一个完整的工作代码。我将深入解释所有概念!。
输入:
19/04/2015 00:00, 180 , 187 , 85 , 162 , 608 , 61
19/04/2015 01:00, 202 , 20 , 26 , 70 , 171 , 61
19/04/2015 02:00, 20 , 40 , 40 , 11 , 40 , 810
代码:
import csv
from datetime import datetime,timedelta
list_of_list = []
with open("old_file.csv","r+") as my_csv:
for line in my_csv:
line = line.strip().replace(" ",'').split(',')
list_of_list.append(line)
for item in list_of_list:
dt = datetime.strptime(item[0],'%d/%m/%Y%H:%M')
item[0]=dt
fin_list = []
for item in list_of_list:
temp_list = [item[0]+timedelta(minutes=10*(i)) for i,x in enumerate(item)]
my_list = [list(a) for a in zip(temp_list,item[1:])]
fin_list.extend(my_list)
for item in fin_list:
item[0] = datetime.strftime(item[0],"%d/%m/%Y %H:%M")
item[0].replace('"','')
print(fin_list)
with open("new_file.csv","w+") as my_csv:
csvWriter = csv.writer(my_csv,delimiter=' ',quotechar = " ")
csvWriter.writerows(fin_list)
输出:
19/04/2015 00:00 180
19/04/2015 00:10 187
19/04/2015 00:20 85
19/04/2015 00:30 162
19/04/2015 00:40 608
19/04/2015 00:50 61
19/04/2015 01:00 202
19/04/2015 01:10 20
19/04/2015 01:20 26
19/04/2015 01:30 70
19/04/2015 01:40 171
19/04/2015 01:50 61
19/04/2015 02:00 20
19/04/2015 02:10 40
19/04/2015 02:20 40
19/04/2015 02:30 11
19/04/2015 02:40 40
19/04/2015 02:50 810
1)请参阅我的每一行,并将它们列入一个列表。同时替换和删除所有whitespaces
,\n
,\r
line = line.strip().replace(" ",'').split(',')
list_of_list.append(line)
之后的输出:
['19/04/201500:00', '180', '187', '85', '162', '608']
2)dt = datetime.strptime(item[0],'%d/%m/%Y%H:%M')
这是什么?来自datetime的strptime
接受一个字符串并将其转换为可以轻松操作的日期时间对象。
示例:
>>> datetime.strptime('19/04/201500:00','%d/%m/%Y%H:%M')
>>> datetime.datetime(2015, 4, 19, 0, 0)
>>> datetime.strptime('19/04/2015 00:00','%d/%m/%Y %H:%M') #notice how this is different from above!
>>> datetime.datetime(2015, 4, 19, 0, 0)
>>> datetime.strptime('Apr 19 2015 12:00','%b %d %Y %H:%M')
>>> datetime.datetime(2015, 4, 19, 12, 0)
你能看到它是如何转变的吗?将其更改为datetime
对象后,您可以轻松地将分钟,日,小时,月份添加到其中!。
但要添加它们,您需要一个timedelta
对象。像integer
integer
datetime
timedelta
添加[item[0]+timedelta(minutes=10*(i)) for i,x in enumerate(item)]
添加enumerate
一样。{/ 1}}
list,string,tuple..etc
你可能会认为嘿这到底是什么?。0,1,2,3,....till last index of iterable (here list)
的一个可迭代的(i,x
)给出了两个东西,即元素。我将在哪里0,item[0]
。因此,i,x
1,item[1]
0,10,20 ,30,40,..
[datetime.datetime(2015, 4, 19, 0, 0), '180']
extend
为[[datetime.datetime(2015, 4, 19, 0, 0), '180'],
[datetime.datetime(2015, 4, 19, 0, 10), '187'],
[datetime.datetime(2015, 4, 19, 0, 20), '85'],
[datetime.datetime(2015, 4, 19, 0, 30), '162'],
[datetime.datetime(2015, 4, 19, 0, 40), '608'],
[datetime.datetime(2015, 4, 19, 0, 50), '61']]
,依此类推。
因此列表理解只会将datetime
分钟添加到每个日期时间对象。
每个项目都在下面,
item[0] = datetime.strftime(item[0],"%d/%m/%Y %H:%M")
最后在strftime
之后你得到了这个:
writer
多么美丽?
现在再次将quotechar = " "
个对象转换为字符串
View
所以Text
将其转换为所需的格式!并且唉使用csv <View style={styles.container}>
<Button
title="Login"
color="red"
onPress={() => this.props.navigation.navigate("Login")} />
</View>
将它们写入新的csv文件中。
注意:默认情况下会打印日期和引号!您在输出中不想要的,因此请使用{{1}}删除它们。
答案 1 :(得分:-1)
这应该有效:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
in_name = 'test.csv'
out_name = 'sample.csv'
with open(in_name, 'rb') as infile, open(out_name, 'wb') as out_file:
for line in infile:
parts = line.split()
date, time, data = parts[0], parts[1], parts[2:]
hours, _ = time.split(':')
for minutes, value in zip(range(0, 60, 10), data):
out_file.write('{date} {hours}:{minutes:02d} {value:>5}\n'.format(
date=date, hours=hours, minutes=minutes, value=value
))
您还有许多未使用的导入,这些导入是不必要的,可以reduce performance。