如何在python

时间:2015-07-30 05:32:01

标签: python sorting date pandas time

我的cvs文件包含日期时间列。在我将csv文件导入python之后,数据框看起来像:

name      date       time      price    ....
vod     01-Nov-13   00:22.9     99
vod     01-Nov-13   00:23.0     98
vod     02-Nov-13   00:22.9     96
vod     02-Nov-13   00:24.1     92
...      ....        ....       ...
vod     31-Dec-13   00:22.9     99

首先,时间列出现了问题。这是交易数据,所以时间应该从 7:00到16:30 。似乎python误读了时间格式。

然而,我按日期对数据进行了排序。数据就像

name      date         ....
vod     01-Nov-13       
vod     01-Dec-13       
vod     02-Nov-13     
vod     02-Dec-13    
vod     03-Nov-13 
vod     03-Dec-13 

再次,日期格式有些错误。时间不应该按此顺序......

我只有一个问题如何在python(pandas)中定义/格式化日期和时间,以便我可以按顺序对数据进行排序。

3 个答案:

答案 0 :(得分:1)

您可以使用

  

来自Python datetime模块datetime对象
  datetime(年,月,日[,小时[,分钟[,秒[,微秒[,tzinfo]]]]])

答案 1 :(得分:1)

好的,虽然我们不知道csv中的时间列如何,但我认为它是hh:mm:ss格式:

name, date, time, price
vod, 01-Nov-13, 07:40:00, 99
vod, 01-Nov-13, 07:34:50, 95

查看以下最小示例。它使用建议的csv输入,将日期和时间列合并为一个日期时间对象。使用dtype datetime64 [ns]列,pandas可以轻松地对数据进行排序。

#!/usr/bin/python                                                                         
import pandas as pd                                                              

# just write a short example.csv to test this.                                                                       
with open('example.csv', 'w') as f:                                              
    f.write('name, date, time, price\n')                                         
    f.write('vod, 01-Nov-13, 07:40:00, 99\nvod, 01-Nov-13, 07:34:50, 95')                     

# read the csv and use the parse_dates option of pd.read_csv to
# format and combine the date and time columns                                                                        
pdf = pd.read_csv('example.csv', parse_dates=[[1, 2]])                            

# for conveniency: rename the column to datetime                         
pdf.rename(columns={' date_ time': 'datetime'}, inplace=True)

# Sort the dataframe according to the datetime column                 
pdf.sort(columns='datetime', inplace=True)

有关parse_dates选项的更多详细信息,请查看doc: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

如果你的csv中的时间格式是parse_dates无法处理的,你可以使用converters中的pd.read_csv选项 - 但为此我们需要知道原始数据的实际情况。

答案 2 :(得分:1)

所以你有两个问题。

首先,时间栏是错误的。通过评论你说csv文件正是你发布的。这意味着您获得的数据类似00:22.9,但您认为这是错误的。由于我们没有可以映射到实际时间的相应数据,因此您可能需要检查时间00:22.9 已用时间 或无论什么(00:22.9可能代表07:22.9?)。

其次,日期字符串排序问题。在这里,我将所有数据转换为dict列表,如下所示:(数据由我自己构建)

data =
[{'date': '01-Nov-13', 'name': 'vod', 'price': '98', 'time': '00:23.0'},
{'date': '01-Jan-13', 'name': 'vod', 'price': '91', 'time': '00:23.0'},
{'date': '02-Nov-13', 'name': 'vod', 'price': '96', 'time': '00:22.0'},
{'date': '01-Dec-13', 'name': 'vod', 'price': '101', 'time': '00:23.0'}]

然后使用sorted函数和datetime模块(请记住sorted函数更改data它自己)

from datetime import datetime
sorted(data, key=lambda each_dict: datetime.strptime(each_dict['date'], '%d-%b-%y'))

%d-%b-%y是与01-Nov-13(日 - 月 - 年)对应的面具,请检查here是否有其他面具。

  • 修改:如果您只想解析日期数据,只需致电:

    datetime.strptime(<date_input>, '%d-%b-%y')
    

    这将返回一个datetime对象,如:

    datetime.datetime(2013, 11, 1, 0, 0)
    

整个排序数据是:

[{'date': '01-Jan-13', 'name': 'vod', 'price': '91', 'time': '00:23.0'},
{'date': '01-Nov-13', 'name': 'vod', 'price': '98', 'time': '00:23.0'},
{'date': '02-Nov-13', 'name': 'vod', 'price': '96', 'time': '00:22.0'},
{'date': '01-Dec-13', 'name': 'vod', 'price': '101', 'time': '00:23.0'}]

唯一的问题是,如果你有大量的数据要排序

,可能需要一些时间/内存