我有一个DataFrame,P
,格式为:
0 1 2
0 10088.245329 9905.462496 12328.830197
1 10092.783624 9688.034026 11785.442316
2 10312.043154 9501.677065 11784.126068
3 10314.919339 9694.886693 11419.465596
...
1438 9636.005396 9544.771643 14181.272599
1439 9414.292352 9312.184926 13988.822708
索引代表当天的分钟。
我想将此格式重新格式化为数据时对象,以便我可以resample
将数据放入半小时内。
我一直在使用to_datetime
功能来执行此操作:
P.index=pd.to_datetime(P.index,format='%M')
这可以获得分钟但不是正确的小时:
<class 'pandas.tseries.index.DatetimeIndex'>
[1900-01-01 00:00:00, ..., 1900-01-01 00:59:00]
有谁知道怎么做?
修改
我管理过:
pd.to_datetime([(str(int(x))+' '+str(y)) for x,y in zip(np.floor(P.index/60),P.index%60)],format='%H %M')
<class 'pandas.tseries.index.DatetimeIndex'>
[1900-01-01 00:00:00, ..., 1900-01-01 23:59:00]
Length: 1440, Freq: None, Timezone: None
我觉得有一种更好的方法吗?
答案 0 :(得分:3)
我放np.arange(1480)
的位置,您可以使用P.index
在&gt; = 0.15.0 / master(2014年10月初发布)
In [5]: pd.Timestamp('20130101') + pd.to_timedelta(np.arange(1480),unit='m')
Out[5]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-01-01 00:00:00, ..., 2013-01-02 00:39:00]
Length: 1480, Freq: None, Timezone: None
适用于所有版本
In [4]: pd.DatetimeIndex((pd.Timestamp('20130101') + pd.to_timedelta(np.arange(1480),unit='m')).values)
Out[4]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-01-01 00:00:00, ..., 2013-01-02 00:39:00]
Length: 1480, Freq: None, Timezone: None
只是为了感兴趣,这里有一个timedelta重新取样:
In [4]: pd.set_option('max_rows',10)
In [5]: df = DataFrame({'A' : np.arange(1480)},index=pd.to_timedelta(np.arange(1480),unit='T'))
In [6]: df
Out[6]:
A
0 days 00:00:00 0
0 days 00:01:00 1
0 days 00:02:00 2
0 days 00:03:00 3
0 days 00:04:00 4
... ...
1 days 00:35:00 1475
1 days 00:36:00 1476
1 days 00:37:00 1477
1 days 00:38:00 1478
1 days 00:39:00 1479
[1480 rows x 1 columns]
In [7]: df.resample('30T',how='sum')
Out[7]:
A
0 days 00:00:00 435
0 days 00:30:00 1335
0 days 01:00:00 2235
0 days 01:30:00 3135
0 days 02:00:00 4035
... ...
0 days 22:30:00 40935
0 days 23:00:00 41835
0 days 23:30:00 42735
1 days 00:00:00 43635
1 days 00:30:00 14745
[50 rows x 1 columns]