基于日期时间的Python CSV数据分析

时间:2016-02-16 22:14:24

标签: python csv datetime dictionary pandas

我有一个大型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来分析和操作数据。

2 个答案:

答案 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

(请注意,它谈论零填充,输出的。它会解析非零填充数字)

相关问题