使用python中的pandas,将年月日和小时的日期分解在单独的列中

Mat*_*ijn 0 python csv timestamp date pandas

阅读 Parse日期,当YYYYMMDD和HH在Python中使用pandas使用python pandas 在单独的列中解析CSV时,日期格式为Year,Day,Hour,Min,Sec

我仍然无法用年,月,日和小时的分隔列解析日期.我的数据看起来像这样(第0列是ID,第一个是年份,第二个是月份,第三个是日,第四个是小时,第五个是值)

50136   2011    1   1   21  9792    
50136   2011    1   1   22  9794    
50136   2011    1   1   23  9796    
50136   2011    1   1   0   9798    
50136   2011    1   1   1   9799    
50136   2011    1   1   2   9802
Run Code Online (Sandbox Code Playgroud)

我试过以下: df = pd.read_csv(file, parse_dates = {'date': [1, 2, 3, 4]}, , index_col='date')但是我得索引不是时间戳而是unicode(?)

In  [17]: print df.head()
Out [17]:
                 0     5
date                    
2011 1 1 21  50136  9792
2011 1 1 22  50136  9794
2011 1 1 23  50136  9796
2011 1 1 0   50136  9798
2011 1 1 1   50136  9799

In  [18]: print df.index
Out [18]:
Index([u'2011 1 1 21', u'2011 1 1 22', u'2011 1 1 23', u'2011 1 1 0', u'2011 1 1 1', u'2011 1 1 2'], dtype=object)
Run Code Online (Sandbox Code Playgroud)

我显然做错了什么,但我无法理解.任何建议都非常感谢.

Rut*_*ies 10

如果常规方法不起作用,您可以始终回避编写自己的解析器.创建一个接受列的函数,parse_dates然后返回一个datetime并添加该函数date_parser.

所以类似于:

df = pd.read_csv(file, header=None, index_col='datetime', 
                 parse_dates={'datetime': [1,2,3,4]}, 
                 date_parser=lambda x: pd.datetime.strptime(x, '%Y %m %d %H'))
Run Code Online (Sandbox Code Playgroud)

返回:

                         0     5
datetime                        
2011-01-01 21:00:00  50136  9792
2011-01-01 22:00:00  50136  9794
2011-01-01 23:00:00  50136  9796
2011-01-01 00:00:00  50136  9798
2011-01-01 01:00:00  50136  9799
2011-01-01 02:00:00  50136  9802
Run Code Online (Sandbox Code Playgroud)

编辑:

如果你把它写成普通函数而不是lambda,它可能会更清楚:

def dt_parse(date_string):

    dt = pd.datetime.strptime(date_string, '%Y %m %d %H')

    return dt
Run Code Online (Sandbox Code Playgroud)