7

我有一个 csv 文件,其中的时间列以毫秒为单位表示 POSIX 时间戳。当我在 pandas 中读取它时,它正确地将其读取为 Int64,但我想将其转换为 DatetimeIndex。现在我首先将它转换为 datetime 对象,然后将其转换为 DatetimeIndex。

In [20]: df.time.head()

Out[20]: 
0    1283346000062
1    1283346000062
2    1283346000062
3    1283346000062
4    1283346000300
Name: time

In [21]: map(datetime.fromtimestamp, df.time.head()/1000.)
Out[21]: 
[datetime.datetime(2010, 9, 1, 9, 0, 0, 62000),
 datetime.datetime(2010, 9, 1, 9, 0, 0, 62000),
 datetime.datetime(2010, 9, 1, 9, 0, 0, 62000),
 datetime.datetime(2010, 9, 1, 9, 0, 0, 62000),
 datetime.datetime(2010, 9, 1, 9, 0, 0, 300000)]

In [22]: pandas.DatetimeIndex(map(datetime.fromtimestamp, df.time.head()/1000.))
Out[22]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2010-09-01 09:00:00.062000, ..., 2010-09-01 09:00:00.300000]
Length: 5, Freq: None, Timezone: None

有没有一种惯用的方式来做到这一点?更重要的是,这是在 pandas 中存储非唯一时间图的推荐方式吗?

4

2 回答 2

7

您可以将转换器与 read_csv 结合使用。

In [423]: d = """\
timestamp data
1283346000062 a
1283346000062 b
1283346000062 c
1283346000062 d
1283346000300 e
"""

In [424]: fromtimestamp = lambda x:datetime.fromtimestamp(int(x) / 1000.)

In [425]: df = pandas.read_csv(StringIO(d), sep='\s+', converters={'timestamp': fromtimestamp}).set_index('timestamp')

In [426]: df.index
Out[426]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2010-09-01 15:00:00.062000, ..., 2010-09-01 15:00:00.300000]
Length: 5, Freq: None, Timezone: None

In [427]: df
Out[427]:
                           data
timestamp
2010-09-01 15:00:00.062000    a
2010-09-01 15:00:00.062000    b
2010-09-01 15:00:00.062000    c
2010-09-01 15:00:00.062000    d
2010-09-01 15:00:00.300000    e
于 2012-09-03T19:13:02.733 回答
5

在内部,时间戳存储在表示纳秒的 int 中。他们使用 numpy datetime/timedelta。您的时间戳的问题在于它们的精度为毫秒,因为您除以 1000 时您已经知道这一点。在这种情况下,更容易输入 astype('M8[ms]')。它本质上是说将这些整数视为具有毫秒精度的日期时间整数。

In [21]: int_arr
Out[21]: 
array([1283346000062, 1283346000062, 1283346000062, 1283346000062,
       1283346000300])

In [22]: int_arr.astype('M8[ms]')
Out[22]: 
array(['2010-09-01T09:00:00.062-0400', '2010-09-01T09:00:00.062-0400',
       '2010-09-01T09:00:00.062-0400', '2010-09-01T09:00:00.062-0400',
       '2010-09-01T09:00:00.300-0400'], dtype='datetime64[ms]')

Pandas 会假设任何常规的 int 数组都在 M8[ns] 中。将正确解释具有 datetime64 dtype 的数组。您可以通过访问它的asi8属性来查看 DatetimeIndex 的 M8[ns] 表示。

[编辑] 我意识到这不会直接帮助您使用 read_csv。只是想我会抛出如何在时间戳数组之间快速转换。

于 2012-09-04T19:37:20.413 回答