我在标题中有一个带有时间戳的输入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
答案 0 :(得分:1)
我最终通过以下方式解决了这个问题:
问题是我有几千个带有时间戳的列标题,我无法直接解析为datetime对象。
因此,为了将这些时间戳对象合并,我添加了一个名为' Time'的新列,然后在其中包含了datetime对象,然后将索引设置为新列(I'通过drop()
方法删除代码,其中我清除了其他标题数据的行:
DF = DF.transpose()
DF['Time'] = timestamps
DF = DF.set_index('Time')
摘要:如果您的标头中有一组带有一组无法解析的时间戳的CSV;解决这个问题的方法是单独解析它们,包含在具有正确日期时间对象的新时间列中,然后基于新列包含set_index()
。