Pandas:如何将RangeIndex转换为正确的DateTimeIndex
我来帮你分析下这两个问题,都是Pandas里设置索引时很容易踩的小坑~
问题1:为何将日期列设为索引后无法得到正常的DateTimeIndex?
这是因为你调用df.set_index(df['T'])的时候,默认不会修改原DataFrame,而是返回一个设置了新索引的副本。如果你没有把这个副本赋值给原变量(比如df = df.set_index(df['T'])),也没有添加inplace=True参数,那原DataFrame的索引还是保持原来的RangeIndex不变,自然看不到DateTimeIndex啦。
简单说就是:你只生成了一个临时的带DateTimeIndex的DataFrame,但没把它保存下来,原df根本没被修改。
问题2:如何将RangeIndex转换为带有正确时间戳的DateTimeIndex?
这里有两种靠谱的解决方法,根据你的场景选择即可:
方法一:正确设置索引(推荐)
既然你已经把T列转成了datetime64[ns]类型,直接用下面两种方式之一修改原DataFrame的索引:
- 方式1:赋值给原变量,生成新的DataFrame
df = df.set_index('T')
- 方式2:原地修改原DataFrame(无需重新赋值)
df.set_index('T', inplace=True)
操作完成后,你的索引就会变成正确的DateTimeIndex。如果想保留T列作为普通列,可以添加drop=False参数,比如df.set_index('T', drop=False, inplace=True)。
方法二:修正误操作后的索引
如果你之前的操作导致索引还是RangeIndex,但T列依然是正确的datetime类型,直接重新执行上面的方法一就可以。
至于你尝试的df.index = pd.to_datetime(df.index)会得到1970年的错误时间,是因为Pandas会把原来的整数索引当成**Unix时间戳(从1970-01-01开始的秒数)**来转换,而你的整数索引只是行号,不是时间戳数值,所以肯定会得到错误的远古时间,以后别这么用啦。
内容的提问来源于stack exchange,提问作者rioZg

