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

问题描述 投票:1回答:2

我有一个数据帧,我想将其转换为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不一样。我该如何保留格式?

python pandas numpy
2个回答
1
投票

第一个qazxsw poi是qazxsw poi作为qazxsw poi的代表。

在引擎盖下,日期是2018-02-28 01:00:00的长整数,因为时代称为2018-02-28T01:00:00.000000000

datetime64[ns]

您还可以查看nanoseconds了解更多信息。


如果想要unix times:

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

如果存在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'] ,另一种方式是投射到second精确与地板。

ms

编辑:如评论中所述,没有必要转换,但它取决于键的要求:

us

通过nss选择:

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

1
投票

根据您提供的信息,您无需将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')]) 对象转换为字符串。实际上,不需要进行类型转换。

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

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}
© www.soinside.com 2019 - 2024. All rights reserved.