按日期排序 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])
请注意,这都是矢量化的,因此会非常快。
我有一个 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])
请注意,这都是矢量化的,因此会非常快。