【问题标题】:Python Pandas: Overwriting an Index with a list of datetime objectsPython Pandas:用日期时间对象列表覆盖索引
【发布时间】:2015-07-02 08:22:21
【问题描述】:

我有一个像这样在标题中带有时间戳的输入 CSV(形成列的时间戳数为数千):

header1;header2;header3;header4;header5;2013-12-30CET00:00:00;2013-12-30CET00:01:00;...;2014-00-01CET00:00:00

在 Pandas 0.12 中,我能够做到这一点,将字符串时间戳转换为日期时间对象。以下代码去除时间戳字符串 (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

但是,我的下游代码要求我运行 pandas 0.16 在 0.16 上运行时,我在上述 sn-p 的最后一行使用上述代码收到此错误:

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

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

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

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

所以,我的问题:

要么: 如何用日期时间覆盖一系列列名,以便我可以传入一组预先安排的时间戳,熊猫将能够在后续代码中识别为时间戳(在熊猫 v0.16 中) 要么: 达到相同效果的任何其他建议。

我已经探索了 set_index()replace()to_datetime()reindex() 以及可能的其他一些,但似乎无法实现这种覆盖。希望这很简单,我只是错过了一些东西。

TIA

【问题讨论】:

  • 最好有 csv 的前几行和几列(这样我们就可以试用代码)。

标签: python datetime indexing pandas


【解决方案1】:

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

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

因此,为了合并这些时间戳对象,我添加了一个名为“时间”的新列,然后将日期时间对象包含在其中,然后将索引设置为新列(我省略了清除其他标题数据行,通过drop() 方法:

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

总结:如果您的 CSV 在您的标头中有一组您无法解析的时间戳;解决此问题的一种方法是分别解析它们,在新的 Time 列中包含正确的 datetime 对象,然后基于新列 set_index()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-26
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 2019-06-22
    • 2013-07-27
    • 2017-04-15
    相关资源
    最近更新 更多