我有一个很大的CSV文件,我们将使用它将资产导入我们的资产管理数据库。下面是CSV数据的一个较小的示例。
Serial number,Movement type,Posting date
2LMXK1,101,1/5/15 9:00
2LMXK1,102,1/5/15 9:30
2LMXK1,201,1/5/15 10:30
2LMXK1,202,1/5/15 13:00
2LMXK1,301,1/5/15 14:00
JEMLP3,101,1/6/15 9:00
JEMLP3,102,1/7/15 10:00
JEMLP3,201,1/7/15 13:30
JEMLP3,202,1/7/15 15:30
JEMLP3,203,1/7/15 17:30
BR83GP,101,1/5/15 9:00
BR83GP,102,1/5/15 13:00
BR83GP,201,1/6/15 9:00
BR83GP,202,1/7/15 15:30
BR83GP,301,1/5/15 13:00
BR83GP,201,1/6/15 9:00
BR83GP,301,1/9/15 15:30
以下是要求:“每个序列号的最新移动类型是什么?”
我需要解析CSV文件和每个唯一的序列号,采取移动类型,有最新的“张贴日期”。
例如,对于序列号2LMXK 1,最新的投递日期/时间是14:00的1/5/15。
以下是我需要获得的基本信息:
序列号2 2LMXK1 1的移动类型为301,最后一次更新为1/5/15 14:00。
我从一些解析CSV文件并创建字典的代码开始。
#Import modules
import csv
import pandas as pd
fields = ['Serial number','Movement type','Posting date']
df = pd.read_csv('import.csv', skipinitialspace=True, usecols=fields)
dc = df.to_dict()
#print (df['Serial number'])
for value in dc.items():
print (value)
这段代码可以解析CSV并创建一个字典。
然而,我需要在日期比较和过滤技术方面的帮助。如何创建另一本只列出最新发布日期的唯一序列号的词典?一旦我创建了一个新的过滤数据字典,我可以使用它导入我们的资产管理数据库。我的想法是,在导入到我们的系统之前,我将使用python来分析和操作数据。
发布于 2016-02-16 23:03:00
熊猫不仅仅是一个阅读csv文件的有用的图书馆。实际上,这里根本不需要csv库(在您发布的代码示例中没有使用它)
首先,您需要使用parse_dates
函数的read_csv
参数,确保将日期读入为日期。然后你可以使用熊猫的分组功能。
# parse the 3rd column (index 2) as dates
df = pd.read_csv('import.csv', skipinitialspace=True, usecols=fields, parse_dates=[2])
last_movement = df.sort_values('Posting date').groupby('Serial number').last()
要创建所需的字符串,可以迭代last_movement
的行。
for index, row in last_movement.iterrows():
print('Serial Number {} has a movement type {} and was last updated {}'
.format(index, row['Movement type'], row['Posting date']))
这将产生以下情况:
Serial Number 2LMXK1 has a movement type 301 and was last updated 2015-01-05 14:00:00
Serial Number BR83GP has a movement type 301 and was last updated 2015-01-09 15:30:00
Serial Number JEMLP3 has a movement type 203 and was last updated 2015-01-07 17:30:00
附带注意:熊猫应该能够为您读取列标题,所以您不需要usecols
参数
发布于 2016-02-16 23:02:00
dict的创建或列表排序的最佳方式在一定程度上取决于您想要的是什么,但是对于事物的解析方面,将字符串转换为date对象,这样您就可以进行正常的比较了等等,您可能希望在datetime中使用datetime模块(是的,datetime.datetime
)。
它有一个strptime()函数,它将精确地完成这个任务:
import datetime
datetime.datetime.strptime(r"1/5/15 13:00", "%d/%m/%y %H:%M")
# I've assumed you have a Day/Month/Year format
唯一奇怪的地方是格式说明符,这里有文档说明:
https://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior
(请注意,在谈到零垫子的地方,这是为了输出。它可以很好地解析非零填充数)
https://stackoverflow.com/questions/35444052
复制相似问题