Pandas将分钟数索引(0到1440)转换为日期时间

时间:2014-09-21 20:41:43

标签: python datetime pandas strftime

我有一个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

我觉得有一种更好的方法吗?

1 个答案:

答案 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]