我希望以1分钟的间隔创建一个DateTimeIndex
,基于开始和结束时间戳(以纪元为单位,以微秒为单位)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')
。
我该怎么做?
答案 0 :(得分:25)
从版本0.18开始,Pandas内置了datetime-like rounding functionality:
start_ts.round('min') # Timestamp('2014-07-28 00:32:00')
end_ts.round('min') # Timestamp('2014-07-28 08:14:00')
如果您需要强制向上或向下舍入,也可以使用.ceil
或.floor
。
修改强>:
如上所述,上述代码适用于原始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]
答案 1 :(得分:6)
我有类似的问题,想要结束这一天。原来这是一种简单的方法(适用于Y [ear] M [月] D [ay],h [我们],m [inute],s [econd])。假设df是一个带有'datecol'列的pandas DataFrame:
df['datecol'] = df['datecol'].values.astype('<M8[m]')
将它四舍五入到m [inute]。鉴于我最初发现了这个问题,我想我会把我得到的答案链接起来,因为它看似相关,
答案 2 :(得分:5)
以简单方法执行此操作目前是一个悬而未决的问题here
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
然而它非常简单。
欢迎提出拉动请求。
答案 3 :(得分:2)
正如@ 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)
答案 4 :(得分: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')
答案 5 :(得分:0)
data.index.round('60S')
大约 60 秒。