我有一个大型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文件,对于每个UNIQUE序列号,请选择具有最新“发布日期”的移动类型。
例如,对于序列号2LMXK1,最新发布日期/时间是15:00的1/5/15。
基本上我需要获得:
“序列号2LMXK1的移动类型为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来分析和操作数据。
答案 0 :(得分:3)
Pandas是一个非常有用的库,不仅仅是读取csv文件。事实上,你根本不需要csv库(它没有在你发布的代码示例中使用)
首先,您需要使用parse_dates
函数的read_csv
参数确保将日期作为日期读入。然后你可以使用pandas'grouping functionality。
# 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
旁注:Pandas应该能够为您读取列标题,因此您不需要usecols
参数
答案 1 :(得分:1)
dict创建或排序列表的最佳方式取决于你想要的东西,但对于解析方面,将字符串转换为日期对象,这样你就可以进行理智的比较等你可能想要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
(请注意,它谈论零填充,输出的。它会解析非零填充数字)