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=True
或parse_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_datetime
在pd.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']))