为什么在将DatetimeIndex转换为np.array时格式会发生变化?

时间:2018-03-03 11:14:46

标签: python pandas numpy

我有一个数据框,我想将其转换为numpy数组。

>>> df.index
DatetimeIndex(['2018-02-28 01:00:00', '2018-02-28 01:01:00',
            '2018-02-28 01:02:00', '2018-02-28 01:03:00',
            '2018-02-28 01:04:00', '2018-02-28 01:05:00',
            '2018-02-28 01:06:00', '2018-02-28 01:07:00',
            '2018-02-28 01:08:00', '2018-02-28 01:09:00',
            ...
            '2018-02-28 17:25:00', '2018-02-28 17:26:00',
            '2018-02-28 17:27:00', '2018-02-28 17:28:00',
            '2018-02-28 17:29:00', '2018-02-28 17:30:00',
            '2018-02-28 17:31:00', '2018-02-28 17:32:00',
            '2018-02-28 17:33:00', '2018-02-28 17:34:00'],
            dtype='datetime64[ns]', name='date', length=995, freq='T')

但如果我只是尝试转换它,格式就会改变。

>>> np.array( ohlc.index )
array(['2018-02-28T01:00:00.000000000', '2018-02-28T01:01:00.000000000',
    '2018-02-28T01:02:00.000000000', '2018-02-28T01:03:00.000000000',
    '2018-02-28T01:04:00.000000000', '2018-02-28T01:05:00.000000000',
    ...
    '2018-02-28T17:30:00.000000000', '2018-02-28T17:31:00.000000000',
    '2018-02-28T17:32:00.000000000', '2018-02-28T17:33:00.000000000',
    '2018-02-28T17:34:00.000000000'], dtype='datetime64[ns]')

似乎2018-02-28 01:00:002018-02-28T01:00:00.000000000不一样。我该如何保留格式?

2 个答案:

答案 0 :(得分:1)

首先2018-02-28 01:00:002018-02-28T01:00:00.000000000,代表datetime64[ns]

由于名为nanoseconds的纪元,因此日期时间为unix time的长整数:

c = a.values.astype(np.int64)
print (c)
[1519779600000000000 1519779660000000000 1519779720000000000
 1519779780000000000 1519779840000000000 1519779900000000000
 1519779960000000000 1519780020000000000 1519780080000000000
 1519780140000000000 1519838700000000000 1519838760000000000
 1519838820000000000 1519838880000000000 1519838940000000000
 1519839000000000000 1519839060000000000 1519839120000000000
 1519839180000000000 1519839240000000000]

您还可以查看this了解详情。

如果想要string s:

b = df.index.astype(str).values

或者:

b = df.index.strftime('%Y-%m-%d %H:%M:%S')
print (b)
['2018-02-28 01:00:00' '2018-02-28 01:01:00' '2018-02-28 01:02:00'
 '2018-02-28 01:03:00' '2018-02-28 01:04:00' '2018-02-28 01:05:00'
 '2018-02-28 01:06:00' '2018-02-28 01:07:00' '2018-02-28 01:08:00'
 '2018-02-28 01:09:00' '2018-02-28 17:25:00' '2018-02-28 17:26:00'
 '2018-02-28 17:27:00' '2018-02-28 17:28:00' '2018-02-28 17:29:00'
 '2018-02-28 17:30:00' '2018-02-28 17:31:00' '2018-02-28 17:32:00'
 '2018-02-28 17:33:00' '2018-02-28 17:34:00']

如果存在secondmsus,另一种方法是转换为ns精确度。

b = df.index.values.astype('datetime64[s]')
print (b)
['2018-02-28T01:00:00' '2018-02-28T01:01:00' '2018-02-28T01:02:00'
 '2018-02-28T01:03:00' '2018-02-28T01:04:00' '2018-02-28T01:05:00'
 '2018-02-28T01:06:00' '2018-02-28T01:07:00' '2018-02-28T01:08:00'
 '2018-02-28T01:09:00' '2018-02-28T17:25:00' '2018-02-28T17:26:00'
 '2018-02-28T17:27:00' '2018-02-28T17:28:00' '2018-02-28T17:29:00'
 '2018-02-28T17:30:00' '2018-02-28T17:31:00' '2018-02-28T17:32:00'
 '2018-02-28T17:33:00' '2018-02-28T17:34:00']

编辑:正如评论中所提到的,没有必要转换,但它取决于密钥的要求:

i = pd.DatetimeIndex(['2018-02-28 01:00:00', '2018-02-28 01:01:00',
            '2018-02-28 01:02:00', '2018-02-28 01:03:00',
            '2018-02-28 01:04:00', '2018-02-28 01:05:00',
            '2018-02-28 01:06:00', '2018-02-28 01:07:00',
            '2018-02-28 01:08:00', '2018-02-28 01:09:00'])
df = pd.DataFrame(index=i)
print (df)
Empty DataFrame
Columns: []
Index: [2018-02-28 01:00:00, 2018-02-28 01:01:00, 2018-02-28 01:02:00, 
        2018-02-28 01:03:00, 2018-02-28 01:04:00, 2018-02-28 01:05:00, 
        2018-02-28 01:06:00, 2018-02-28 01:07:00, 2018-02-28 01:08:00, 
        2018-02-28 01:09:00]

Timestamp选择:

d = dict(zip(df.index, np.arange(10)))
{Timestamp('2018-02-28 01:00:00'): 0, Timestamp('2018-02-28 01:01:00'): 1, 
 Timestamp('2018-02-28 01:02:00'): 2, Timestamp('2018-02-28 01:03:00'): 3, 
 Timestamp('2018-02-28 01:04:00'): 4, Timestamp('2018-02-28 01:05:00'): 5, 
 Timestamp('2018-02-28 01:06:00'): 6, Timestamp('2018-02-28 01:07:00'): 7, 
 Timestamp('2018-02-28 01:08:00'): 8, Timestamp('2018-02-28 01:09:00'): 9}

print (d[pd.Timestamp('2018-02-28 01:00:00')])
0

print (d[pd.to_datetime('2018-02-28 01:00:00')])

按字符串选择,最简单:

d1 = dict(zip(df.index.astype(str).values, np.arange(10)))
{'2018-02-28 01:00:00': 0, '2018-02-28 01:01:00': 1, '2018-02-28 01:02:00': 2, 
 '2018-02-28 01:03:00': 3, '2018-02-28 01:04:00': 4, '2018-02-28 01:05:00': 5, 
 '2018-02-28 01:06:00': 6, '2018-02-28 01:07:00': 7, '2018-02-28 01:08:00': 8, 
 '2018-02-28 01:09:00': 9}

d1 = dict(zip(df.index.strftime('%Y-%m-%d %H:%M:%S'), np.arange(10)))
{'2018-02-28 01:00:00': 0, '2018-02-28 01:01:00': 1, '2018-02-28 01:02:00': 2, 
 '2018-02-28 01:03:00': 3, '2018-02-28 01:04:00': 4, '2018-02-28 01:05:00': 5, 
 '2018-02-28 01:06:00': 6, '2018-02-28 01:07:00': 7, '2018-02-28 01:08:00': 8, 
 '2018-02-28 01:09:00': 9}

print (d1['2018-02-28 01:00:00'])
0
print (dict(zip(df.index.values.astype('datetime64[s]'), np.arange(10))))
{numpy.datetime64('2018-02-28T01:00:00'): 0, 
 numpy.datetime64('2018-02-28T01:01:00'): 1, 
 numpy.datetime64('2018-02-28T01:02:00'): 2, 
 numpy.datetime64('2018-02-28T01:03:00'): 3, 
 numpy.datetime64('2018-02-28T01:04:00'): 4, 
 numpy.datetime64('2018-02-28T01:05:00'): 5, 
 numpy.datetime64('2018-02-28T01:06:00'): 6, 
 numpy.datetime64('2018-02-28T01:07:00'): 7, 
 numpy.datetime64('2018-02-28T01:08:00'): 8, 
 numpy.datetime64('2018-02-28T01:09:00'): 9}

答案 1 :(得分:1)

根据您提供的信息,您不需要将datetime个对象转换为字符串。实际上,不需要进行类型转换。

尽可能保持数据,输入和输出的结构化。字符串通常仅对I / O有用。

import pandas as pd
from dateutil import parser

idx = pd.DatetimeIndex(['2018-02-28 01:00:00', '2018-02-28 01:01:00',
                        '2018-02-28 01:02:00', '2018-02-28 01:03:00',
                        '2018-02-28 01:04:00', '2018-02-28 01:05:00'],
                       dtype='datetime64[ns]', name='date')

values = [1, 2, 3, 4, 5, 6]

d = dict(zip(idx, values))

x = parser.parse('2018-02-28 01:02:00') 
# equivalently, x = pd.to_datetime('2018-02-28 01:02:00')

d[x]  # 3

将密钥存储为字符串时,请考虑这个基本问题:

x = parser.parse('2018-02-28 01:02:00')
y = parser.parse('2018-02-28 1:02:00')

print(x == y)          # True

x_str = '2018-02-28 01:02:00'
y_str = '2018-02-28 1:02:00'

print(x_str == y_str)  # False