[英]How to split values from a CSV file in python using pandas or otherwise?
[英]How to split values in a CSV file
我有一个如下所示的 CSV 文件。 现在它没有任何列,它包含一些我实际上不需要的字段,所以我需要根据某些条件将它写入一个新文件。
!PROJECT1, OBJECT1
2020-09-10+02:00,100,HHH,SAS,RM$20,1,1
2020-09-16+02:00,200,GGG,SAS,TAKE,2020-09-16+02:00
2020-09-13+02:00,300,TTT,SAS,TAKE,2020-09-13+02:00
2020-09-11+02:00,100,HHH,SAS,RM$20,1,1
这些是条件:
index[4]
包含单词TAKE
我只会写记录。 如果是这样,取index[0]
、 [4]
和[5]
。YEAR
, MONTH
和DAY
和TD
吐出和命名。 index[4]
需要命名为TYPE
我希望我的新文件看起来像这样:
YEAR MONTH DAY TD TYPE YEAR MONTH DAY TD
2020 09 16 2 TAKE 2020 09 16 2
2020 09 13 2 TAKE 2020 09 13 2
这是我的代码:
def filter_row(r):
condition_1 = r[4] == 'TAKE' #<-- take only the TAKE's
with open(file_path, 'r') as my_file, open('outputfile.txt', 'w') as outer:
reader = csv.reader(my_file, delimiter = ',')
next(reader) #Skip the first row because it's just the header
writer = csv.writer(outer, delimiter = '\t')
for row in reader:
if filter_row(row):
writer.writerow(row)
现在我的输出文件如下所示:
2020-09-16+02:00, 200, GGG, SAS, TAKE, 2020-09-16+02:00
2020-09-13+02:00, 300, TTT, SAS, TAKE, 2020-09-13+02:00
这里有两个任务。 首先过滤数据,然后解析数据,得到需要的值。
过滤可以使用内置的过滤器函数来完成(如果你愿意,也可以使用列表理解或生成器表达式)。 对于解析,可以使用一个小函数,因为我们需要每行处理两个日期。
operator.itemgetter用于有效地从行中提取数据。
import csv
import operator
# Get the value of the 'take' column
type_getter = operator.itemgetter(4)
# Extract the columns we want to work with
columns_getter = operator.itemgetter(0, 4, 5)
def process_datestring(datestring):
# Assumes offset is always positive; consider
# using re.split if it could be positive or negative.
date, _, offset = datestring.partition('+')
dateparts = date.split('-')
td, *_ = offset.partition(':')
dateparts.append(td)
return dateparts
headers = ['YEAR', 'MONTH', 'DAY', 'TD', 'TYPE', 'YEAR', 'MONTH', 'DAY', 'TD']
with open(file_path, 'r') as my_file, open('outputfile.txt', 'w') as outer:
reader = csv.reader(my_file, delimiter = ',')
next(reader) #Skip the first row because it's just the header
writer = csv.writer(outer, delimiter = '\t')
writer.writerow(headers)
filtered = filter(lambda r: type_getter(r) == 'TAKE', reader)
for row in filtered:
date1, type_, date2 = columns_getter(row)
out_row = process_datestring(date1)
out_row.append(type_)
out_row.extend(process_datestring(date2))
writer.writerow(out_row)
你可以写一个解析函数。 像这样的东西:
def parser(row):
if "TAKE" in row[4]: #Checks for your 'TAKE' statement
year = row[0][0:4]
month = row[0][5:7]
...
year_2 = row[5][0:4]
...
return [year, month, day, td, row[4], year_2, month_2,...]
把这整件事交给你的作家:
for row in reader:
converted = parser(row)
writer.writerow(converted)
这应该有效。 如果您想更加小心,您必须使用strptime
将字符串转换为datetime.datetime
对象,然后提取日期,但如果切碎字符串足够好,您可以这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.