Python Pandas:使用日期时间对象列表覆盖索引

时间:2015-04-23 22:28:12

标签: python datetime indexing pandas

我在标题中有一个带有时间戳的输入CSV(形成列的时间戳数量是几千):

  

头1; HEADER2; header3; header4; header5; 2013-12-30CET00:00:00; 2013-12-30CET00:01:00; ...; 2014-00-01CET00:00:00

在Pandas 0.12中我能够做到这一点,将字符串时间戳转换为datetime对象。以下代码删除时间戳字符串(translate())中的“CEST”,将其作为日期时间(strptime())读取,然后将其本地化为正确的时区(localize())[这种方法的原因是因为,至少我使用的版本,CEST并未被识别为时区]。

DF = pd.read_csv('some_csv.csv',sep=';')
transtable = string.maketrans(string.uppercase,' '*len(string.uppercase))
tz = pytz.country_timezones('nl')[0]
timestamps = DF.columns[5:]
timestamps = map(lambda x:x.translate(transtable), timestamps)
timestamps = map(lambda x:datetime.datetime.strptime(x, '%Y-%m-%d %H:%M:%S'), timestamps)
timestamps = map(lambda x: pytz.timezone(tz).localize(x), timestamps)
DF.columns[5:] = timestamps

但是,我的下游代码要求我跑掉大熊猫0.16 在0.16上运行时,我在上面代码片段的最后一行用上面的代码得到了这个错误:

  

*** TypeError:索引不支持可变操作

我正在寻找一种用datetime对象覆盖索引的方法。使用方法to_datetime()对我不起作用,返回:

  

*** ValueError:未知的字符串格式

我有一些后续代码复制,然后删除此数据帧中的前几列数据(所有'header1; header2,header3'只留下时间戳。目的是转置,并按时间戳索引。

所以,我的问题:

或者: 如何用日期时间覆盖一系列列名,这样我就可以传递一组预先安排的时间戳,这些时间戳可以将pandas识别为后续代码中的时间戳(在pandas v0.16中) 要么: 任何其他可以达到同样效果的建议。

我已经探索过set_index()replace()to_datetime()reindex()以及其他一些人,但似乎没有能够实现此覆盖。希望这很简单,我只是遗漏了一些东西。

TIA

1 个答案:

答案 0 :(得分:1)

我最终通过以下方式解决了这个问题:

问题是我有几千个带有时间戳的列标题,我无法直接解析为datetime对象。

因此,为了将这些时间戳对象合并,我添加了一个名为' Time'的新列,然后在其中包含了datetime对象,然后将索引设置为新列(I'通过drop()方法删除代码,其中我清除了其他标题数据的行:

    DF = DF.transpose()  
    DF['Time'] = timestamps 
    DF = DF.set_index('Time') 

摘要:如果您的标头中有一组带有一组无法解析的时间戳的CSV;解决这个问题的方法是单独解析它们,包含在具有正确日期时间对象的新时间列中,然后基于新列包含set_index()