pandas可以自动识别date吗?

今天,我感到非常惊讶的是,从数据文件(例如)读取数据时,pandas能够识别值的types:

df = pandas.read_csv('test.dat', delimiter=r"\s+", names=['col1','col2','col3']) 

例如,可以通过这种方式检查:

 for i, r in df.iterrows(): print type(r['col1']), type(r['col2']), type(r['col3']) 

在特定的整数,浮游物和string被正确识别。 不过,我有一个具有以下格式的date的列: 2013-6-4 。 这些date被认为是string(而不是Pythondate对象)。 有什么方法可以将“pandas”学习到认可的date?

阅读时应该添加parse_dates=Trueparse_dates=['column name'] ,这通常足以神奇地parsing它。 但总是有奇怪的格式需要手动定义。 在这种情况下,您还可以添加dateparsing器函数,这是最灵活的方式。

假设你的string有一个“datetime”列,那么:

 dateparse = lambda x: pd.datetime.strptime(x, '%Y-%m-%d %H:%M:%S') df = pd.read_csv(infile, parse_dates=['datetime'], date_parser=dateparse) 

这样,您甚至可以将多个列组合到一个date时间列中,这会将“date”和“时间”列合并到一个“date时间”列中:

 dateparse = lambda x: pd.datetime.strptime(x, '%Y-%m-%d %H:%M:%S') df = pd.read_csv(infile, parse_dates={'datetime': ['date', 'time']}, date_parser=dateparse) 

pandas read_csv方法非常适合parsingdate。 完整的文档在http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html

您甚至可以在不同的列中包含不同的date部分并传递参数:

 parse_dates : boolean, list of ints or names, list of lists, or dict If True -> try parsing the index. If [1, 2, 3] -> try parsing columns 1, 2, 3 each as a separate date column. If [[1, 3]] -> combine columns 1 and 3 and parse as a single date column. {'foo' : [1, 3]} -> parse columns 1, 3 as date and call result 'foo' 

date的默认感应效果很好,但似乎偏向于北美date格式。 如果你住在其他地方,你可能偶尔会被结果所困扰。 据我记得2000年1月6日意味着1月6日在美国,而不是我住的6月。 如果使用23/6/2000这样的date的话,它足够聪明。 尽pipe如此,保持YYYYMMDDdate变化可能更安全。 向大pandas开发者表示歉意,但是我最近没有用当地的date进行testing。

你可以使用date_parserparameter passing一个函数来转换你的格式。

 date_parser : function Function to use for converting a sequence of string columns to an array of datetime instances. The default uses dateutil.parser.parser to do the conversion. 

也许pandas界面已经改变,因为@Rutger回答,但在我使用的版本(0.15.2), date_parser函数接收date列表,而不是一个单一的值。 在这种情况下,他的代码应该如下更新:

 dateparse = lambda dates: [pd.datetime.strptime(d, '%Y-%m-%d %H:%M:%S') for d in dates] df = pd.read_csv(infile, parse_dates=['datetime'], date_parser=dateparse) 

是的 – 根据pandas.read_csv 文档 :

注意: iso8601格式的date存在快速path。

因此,如果您的csv有一个名为datetime的列,并且date看起来像2013-01-01T01:01 ,那么运行这个命令将使pandas(我在v0.19.2上)自动获取date和时间:

df = pd.read_csv('test.csv', parse_dates=['datetime'])

请注意,您需要显式传递parse_dates ,它不工作没有。

validation:

df.dtypes

你应该看到该列的数据types是datetime64[ns]

您可以pandas.to_datetime()的文档中的build议使用pandas.read_csv()

如果列或索引包含不可parsing的date,则整个列或索引将作为对象数据types不变地返回。 对于非标准的date时间parsing, pd.to_datetimepd.read_csv之后使用pd.read_csv

演示:

 >>> D = {'date': '2013-6-4'} >>> df = pd.DataFrame(D, index=[0]) >>> df date 0 2013-6-4 >>> df.dtypes date object dtype: object >>> df['date'] = pd.to_datetime(df.date, format='%Y-%m-%d') >>> df date 0 2013-06-04 >>> df.dtypes date datetime64[ns] dtype: object 

将两列合并到单个date时间列时,接受的答案会生成一个错误(pandas版本0.20.3),因为这些列分别发送到date_parser函数。

以下工作:

 def dateparse(d,t): dt = d + " " + t return pd.datetime.strptime(dt, '%d/%m/%Y %H:%M:%S') df = pd.read_csv(infile, parse_dates={'datetime': ['date', 'time']}, date_parser=dateparse) 

df = pd.read_csv(“/ home / manoj / Desktop / train_aWnotuB.csv”,parse_dates = ['DateTime'])

Features = list(map(lambda x:[x.hour,x.day,x.weekday(),x.month,x.year],df ['DateTime']))