按日期排序 Pandas 数据框,Return 唯一日期,然后是前两个的纪元时间

Sort Pandas Dataframe by Date, Return unique Dates and then Epoch time for the top two

我有一个 pandas 数据框如下:

        Date Symbol
0 2015-02-20      A
1 2016-01-15      A
2 2016-01-15      A
3 2015-08-21      A

我需要输出为按纪元时间排序的唯一日期列表。像下面这样: [1424390400, 1440115200, 1452816000]

但是当我 return 来自 Dataframe 的唯一日期时,我得到: ['2015-02-19T18:00:00.000000000-0600' '2016-01-14T18:00:00.000000000-0600' '2015-08-20T19:00:00.000000000-0500']

显示的时间不正确;他们最终休息了一整天。

如何按日期排序,return 唯一,然后转换为 00:00:00 小时的纪元?提前致谢。

这是我目前拥有的演示脚本:

import pandas as pd

df =pd.DataFrame( {'Symbol':['A','A','A','A'] ,'Date'
    ['02/20/2015','01/15/2016', '01/15/2016','08/21/2015']})

df['Date'] = pd.to_datetime(df.Date)
dates = df['Date'].unique()
print dates

这是我唯一能想到的技巧。

import pandas as pd
import numpy as np
df =pd.DataFrame( {'Symbol':['A','A','A','A'] ,'Date':['02/20/2015','01/15/2016', '01/15/2016','08/21/2015']})

df['Date'] = pd.to_datetime(df.Date)
df = df.sort('Date')
dates = []
seen = []
for i in df['Date']:
    if i in seen:
        continue
    else:
        seen.append(i)
        dates.append(str(i).split(' ')[0])
    if len(dates)==2: 
        break
print dates

然后使用以下方法将其转换为纪元:

for i in dates:
    cur_dates = i.split('-')
    epoch = int((datetime(int(cur_dates[0]),int(cur_dates[1]),int(cur_dates[2]),0,0) - datetime(1970,1,1)).total_seconds())
    epoch = str(epoch)

经过一些试验,当您调用 df['Date'].unique() 时,时间似乎发生了变化。 Pandas unique() 方法 returns 一个 Numpy ndarray。所以这实际上将您的列元素从 pandas Timestamps 转换为 Numpy datetime64 类型。此过程正在应用奇怪的时区和小时班次。

要获取唯一纪元时间整数列表,请尝试:

dates = df['Date'].map(lambda t: t.value / (10**9)).unique()

由于df['Date']的元素是时间戳,我们可以通过调用t.value得到纳秒值,然后除以10^9转换为纪元秒。

这不是错误,而是使用 numpy 的显示 'issue'。 Numpy 选择在本地时区显示日期时间(我认为是出于历史原因)。

In [21]: df['Date'].unique()
Out[21]: 
array(['2015-02-19T19:00:00.000000000-0500',
       '2016-01-14T19:00:00.000000000-0500',
       '2015-08-20T20:00:00.000000000-0400'], dtype='datetime64[ns]')

转换回 DatetimeIndex(pandas returns 由于兼容原因,作为 numpy 数组是唯一的)。

In [22]: pd.DatetimeIndex(df['Date'].unique())
Out[22]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2015-02-20, ..., 2015-08-21]
Length: 3, Freq: None, Timezone: None

一点点数学就可以让你得到纪元秒。基础数据以 ns 精度存储。

In [23]: pd.DatetimeIndex(df['Date'].unique()).asi8/10**9
Out[23]: array([1424390400, 1452816000, 1440115200])

请注意,这都是矢量化的,因此会非常快。