基于日期时间的 Python CSV 数据分析
Posted
技术标签:
【中文标题】基于日期时间的 Python CSV 数据分析【英文标题】:Python CSV data analysis based on date time 【发布时间】:2016-05-28 09:51:13 【问题描述】:我有一个大的 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 文件,并为每个唯一序列号获取具有最新“发布日期”的运动类型。
例如,序列号 2LMXK1 的最新发布日期/时间是 2015 年 1 月 5 日 14:00。
这基本上是我需要获得的:
“序列号 2LMXK1 的机芯类型为 301,最后更新时间为 2015 年 1 月 5 日 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 来分析和操作数据。
【问题讨论】:
【参考方案1】:创建字典或对列表进行排序的最佳方式在一定程度上取决于您想要什么,但在解析方面,将字符串转换为日期对象,以便您可以进行合理的比较等,您可能需要 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
(请注意,它谈到零填充的地方,那是为了输出。它会很好地解析非零填充数字)
【讨论】:
【参考方案2】:Pandas 是一个有用的库,不仅仅用于读取 csv 文件。实际上,这里根本不需要 csv 库(您发布的代码示例中没有使用它)
首先,您需要通过使用read_csv
函数的parse_dates
参数确保将日期作为日期读入。然后就可以使用 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
参数
【讨论】:
很好的答案!我不认为它可以用更少的代码行来完成。需要注意的是,“sort_values”是在pandas 0.17中添加的 @FrancescTorradeflot 是的。我认为,早期版本的熊猫有一个排序功能可以做同样的事情。较新的版本抱怨该版本已折旧。以上是关于基于日期时间的 Python CSV 数据分析的主要内容,如果未能解决你的问题,请参考以下文章
从 csv.reader 之后的列(Python Pandas)中获取最早的日期
Python pandas - 将具有多个日期索引的csv合并到单个日期索引