2017-12-18 118 views
1

我有熊猫系列枣myS重新设置仅在熊猫系列日期时间指数

import pandas as pd 

该指数是一组包含时间字符串的唯一

myS.index 

Out[28]: 
Index([u'12:00 AM', u'12:14 AM', u'12:18 AM', u'12:25 AM', u'12:26 AM', 
     u'12:37 AM', u'12:41 AM', u'12:47 AM', u'12:55 AM', u'12:59 AM', 
     ... 
     u'11:00 PM', u'11:02 PM', u'11:09 PM', u'11:18 PM', u'11:25 PM', 
     u'11:35 PM', u'11:42 PM', u'11:46 PM', u'11:50 PM', u'11:55 PM'], 
     dtype='object', name=u'Time (CET)', length=169) 

我可以方便地将它转换为日期时间正确:

myS.index= pd.to_datetime(myS.index, format='%I:%M %p') 

但是,所有的日期将被设置为1900-01-01

'1900-01-01 23:50:00', '1900-01-01 23:55:00'], 
       dtype='datetime64[ns]', 

如果我有日期时间可用,我怎么能索引的所有日期复位到期望值而保留的时间?

回答

1

我想你需要添加Date列,然后转换为datetime

myS.index = pd.to_datetime(myS['Date'].astype(str) + ' ' + myS.index) 

或者添加标量:

myS.index = pd.to_datetime('2015-01-05' + ' ' + myS.index) 

通过编辑点评:

myS.index = pd.to_datetime(str(mydatetime.date()) + ' ' + myS.index, 
          format='%Y-%m-%d %I:%M %p',errors='coerce') 

或者使用strftime

myS.index = pd.to_datetime(mydatetime.strftime('%Y-%m-%d') + ' ' + 
          myS.index, format='%Y-%m-%d %I:%M %p',errors='coerce') 

样品:

idx = pd.Index([u'12:00 AM', u'12:14 AM', u'12:18 AM', u'12:25 AM']) 
myS = pd.Series(range(4), index=idx) 
print (myS) 
12:00 AM 0 
12:14 AM 1 
12:18 AM 2 
12:25 AM 3 
dtype: int64 

mydatetime = pd.datetime.now() 
print (mydatetime) 
2017-12-18 07:52:26.503385 

myS.index = pd.to_datetime(str(mydatetime.date()) + ' ' + 
          myS.index, format='%Y-%m-%d %I:%M %p',errors='coerce') 

print (myS) 
2017-12-18 00:00:00 0 
2017-12-18 00:14:00 1 
2017-12-18 00:18:00 2 
2017-12-18 00:25:00 3 
dtype: int64 
+0

此解决方案是正确的。但是,如果我的日期时间是单个值而不是现有的数据框列,那么ast(str)将不起作用(AttributeError:'datetime.datetime'对象没有属性'astype'),而str(mydatetime.date())会执行 – ErroriSalvo

+0

感谢您的评论,我添加它来回答。 – jezrael

+0

哎呀,我失去了你的评论,对不起:( – jezrael

1
  1. 将所有时间字符串加上所需的日期字符串。
  2. 使用pd.to_datetime,并附加日期格式字符串。

例如,如果您有2017-03-05 12:18 AM,则您的格式字符串将变为%Y-%m-%d %I:%M %p

myS.index = pd.to_datetime('2017-03-05 ' + myS.index, '%Y-%m-%d %I:%M %p') 

(原来的默认格式非常适用于这种情况,所以format='%Y-%m-%d %I:%M %p'是可选的。)

+0

感谢,这是正确的。但是,我并不真的赞成自动格式识别,因为您总是会在某处找到10-2-2017,如果您未设置显式转换规则,结果可能与数据有关 – ErroriSalvo