我的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)中定义/格式化日期和时间,以便我可以按顺序对数据进行排序。
答案 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'}]
唯一的问题是,如果你有大量的数据要排序
,可能需要一些时间/内存