将 Pandas 时间戳舍入为分钟

问题描述 投票:0回答:6

我想根据开始和结束时间戳(自纪元以来以微秒为单位给出)和

DateTimeIndex
以 1 分钟为间隔创建一个
pd_date_range()
。为此,我需要向上舍入开始时间戳并向下舍入结束时间戳。这是我到目前为止所拥有的:

import pandas as pd
start = 1406507532491431
end = 1406535228420914

start_ts = pd.to_datetime(start, unit='us') # Timestamp('2014-07-28 00:32:12.491431')
end_ts = pd.to_datetime(end, unit='us') # Timestamp('2014-07-28 08:13:48.420914')

我要四舍五入:

start_ts
Timestamp('2014-07-28 00:32')

end_ts
Timestamp('2014-07-28 08:14')

我该怎么做?

python pandas
6个回答
62
投票

从版本 0.18 开始,Pandas 内置了类似日期时间的舍入功能

start_ts.round('min')  # Timestamp('2014-07-28 00:32:00')
end_ts.round('min')    # Timestamp('2014-07-28 08:14:00')

如果需要强制向上或向下舍入,您还可以使用

.ceil
.floor


编辑: 正如OP所要求的,上面的代码适用于原始

pd.Timestamp
。如果您使用
pd.Series
,请使用
dt
访问器:

s = pd.Series(pd.to_datetime([1406507532491431000, 1406535228420914000]))
s.dt.round('min')

输出:

0   2014-07-28 00:32:00
1   2014-07-28 08:14:00
dtype: datetime64[ns]

6
投票

以简单的方法做到这一点目前是一个悬而未决的问题这里

In [22]: start = 1406507532491431

In [23]: end = 1406535228420914

[26]: dti = pd.to_datetime([start,end],unit='us')

In [27]: dti
Out[27]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2014-07-28 00:32:12.491431, 2014-07-28 08:13:48.420914]
Length: 2, Freq: None, Timezone: None

In [29]: pd.DatetimeIndex(((dti.asi8/(1e9*60)).round()*1e9*60).astype(np.int64))
Out[29]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2014-07-28 00:32:00, 2014-07-28 08:14:00]
Length: 2, Freq: None, Timezone: None

尽管如此,它还是很简单。

欢迎请求实施。


6
投票

我也有类似的问题,想结束这一天。事实证明有一个简单的方法(它适用于 Y[ear] M[month] D[ay], h[our], m[inute], s[econd])。假设 df 是一个带有“datecol”列的 pandas DataFrame:

df['datecol'] = df['datecol'].values.astype('<M8[m]')

将其四舍五入到 m[inute]。鉴于我最初发现这个问题,我想我会链接回我得到的答案,因为它似乎相关,

使用 pandas 更有效地舍入日期时间戳的方法


3
投票

正如@user3735204所述,可以使用以下方法对列进行四舍五入:

df['datecol'] = df['datecol'].astype('datetime64[m]')

方括号中的单位可以是:

Y[ear] M[month] D[ay], h[our], m[inute], s[econd]

也可以通过将列作为索引并应用 round 方法(在 pandas 0.19.0 中可用)来舍入到最接近的值(reference):

df.index = pd.to_datetime(df['datecol'])
df.index = df.index.round("S")

示例:

df = pd.DataFrame(data = tmpdata)
df['datecol'] = df['datecol'].astype('datetime64[s]')
print df['datecol']

0   2016-10-05 05:37:42
1   2016-10-05 05:37:43
Name: datecol, dtype: datetime64[ns]

df.index = pd.to_datetime(df['datecol'])
df.index = df.index.round("S")

print df.index

DatetimeIndex(['2016-10-05 05:37:43', '2016-10-05 05:37:43'], dtype='datetime64[ns]', name=u'timestamp', freq=None)

1
投票

data.index.round('60S')

只需 60 秒左右。


0
投票
import pandas as pd
new_index = pd.date_range(start=start_ts.strftime('%Y-%m-%d %H:%M'), end=end_ts.strftime('%Y-%m-%d %H:%M'), freq='1min')
© www.soinside.com 2019 - 2024. All rights reserved.