我有一个数据框,我想将其转换为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:00
和2018-02-28T01:00:00.000000000
不一样。我该如何保留格式?
答案 0 :(得分:1)
首先2018-02-28 01:00:00
为2018-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']
如果存在second
,ms
,us
,另一种方法是转换为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