尝试将数据框中的列从1-420个月(1985年到2010年的35年月度数据)转换为日期时间对象。
示例数据框:
import pandas as pd
import numpy as np
dates = pd.Series(range(1,421))
df2 = pd.DataFrame(np.random.randn(420,4),index=dates,columns=list('ABCD'))
将索引转换为日期时间对象:
df2.index = pd.to_datetime(df2.index,unit='M', origin='1981-01-01')
给出错误:
ValueError: cannot cast unit M
我不知道为什么它不会投射单位M,就像我尝试的那样。而不是' M'它有效,并且每天上升 - 为什么每月都会上升?我从here得到了单位。
使用' m'输出看起来像这样:
A B C D
1981-01-01 00:01:00 0.672397 0.753926 0.865845 0.711594
1981-01-01 00:02:00 0.786754 0.658421 -0.111609 -1.459447
1981-01-01 00:03:00 0.200273 -1.485525 -1.939203 0.921833
1981-01-01 00:04:00 -1.589668 0.109760 -1.349790 -1.951316
1981-01-01 00:05:00 0.133847 -0.359300 -1.246740 -0.835645
1981-01-01 00:06:00 -0.843962 1.222129 -0.121450 -1.223132
1981-01-01 00:07:00 -0.818932 0.731127 0.984731 -1.028384
在几分钟内上升,我希望它在几个月内上升:
A B C D
1981-01-01 00:00:00 0.672397 0.753926 0.865845 0.711594
1981-02-01 00:00:00 0.786754 0.658421 -0.111609 -1.459447
1981-03-01 00:00:00 0.200273 -1.485525 -1.939203 0.921833
答案 0 :(得分:2)
您应该使用date_range:
df2.index = pd.date_range('1981/1/1', periods=len(df2), freq='MS')
输出:
A B C D
1981-01-01 -0.761933 0.726808 0.589712 -1.170934
1981-02-01 0.030521 -0.892427 -1.366809 -1.515724
1981-03-01 -0.282887 1.068047 0.244493 -0.247356
有关详细信息,请查看offset alias。
编辑:正如OP所说,425天重复超过200,000行。下面的代码将提供重复索引。daterange = pd.date_range('1981/1/1', periods=420, freq='MS')
然后通过重复它来展开它以适合您的数据框。
df2.index = list(daterange) * math.floor(len(df2)/len(list(daterange))) + list(daterange)[0:math.floor(len(df2)%len(list(daterange)))]