Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将熊猫数据帧中的'TimeStamp'列截断为小时精度`_Python_Pandas_Datetime_Dataframe - Fatal编程技术网

Python 将熊猫数据帧中的'TimeStamp'列截断为小时精度`

Python 将熊猫数据帧中的'TimeStamp'列截断为小时精度`,python,pandas,datetime,dataframe,Python,Pandas,Datetime,Dataframe,我有一个名为df的pandas.DataFrame,它有一个自动生成的索引,带有一列dt: df['dt'].dtype, df['dt'][0] # (dtype('<M8[ns]'), Timestamp('2014-10-01 10:02:45')) 这很有效,所以没关系。然而,我知道有一些很好的方法可以使用pandas.tseries.offset或创建DatetimeIndex或类似的方法 如果可能的话,是否有一些pandas魔法可以做到这一点?在pandas 0.18.0及更

我有一个名为
df
pandas.DataFrame
,它有一个自动生成的索引,带有一列
dt

df['dt'].dtype, df['dt'][0]
# (dtype('<M8[ns]'), Timestamp('2014-10-01 10:02:45'))
这很有效,所以没关系。然而,我知道有一些很好的方法可以使用
pandas.tseries.offset
或创建
DatetimeIndex
或类似的方法


如果可能的话,是否有一些
pandas
魔法可以做到这一点?

在pandas 0.18.0及更高版本中,有datetime和方法将时间戳舍入到给定的固定精度/频率。要将精度四舍五入到小时,可以使用:

>>> df['dt2'] = df['dt'].dt.floor('h')
>>> df
                      dt                     dt2
0    2014-10-01 10:02:45     2014-10-01 10:00:00
1    2014-10-01 13:08:17     2014-10-01 13:00:00
2    2014-10-01 17:39:24     2014-10-01 17:00:00

这里有另一种截断时间戳的方法。与
floor
不同,它支持截断到年或月等精度

您可以临时调整基础NumPy
datetime64
数据类型的精度单位,将其从
[ns]
更改为
[h]

df['dt'].values.astype('<M8[h]')

df['dt'].values.astype('我过去用来实现这一目标的方法如下(与您已经在做的事情非常类似,但我还是想把它扔出去):

或者:

df.dt.index.to_period("h") # for the period
df.dt.index.to_period("h").to_timestamp() # for the timestamp truncated
这是实现这一目标的最不含糊的(更像蟒蛇?)方式。 使用
floor
/
round
/
ceil
进行较粗的一轮(月、年……)时,您将收到一条错误消息

ValueError: <YearEnd: month=12> is a non-fixed frequency
ValueError:是一个非固定频率

请参阅此处的讨论:

因此,您需要相同的值,但不需要秒数correct@EdChum没有分钟或秒…我只对小时精度感兴趣伟大的答案。比
日期时间快。替换
,这是上面提到的最常见的解决方案。我的dt系列有一个毫秒术语(+00:00)我想去掉的。你答案的第一部分似乎是四舍五入(将术语设置为零),但不是截断。你答案的第二部分使用了astype。谢谢!这三个词的分钟频率都很高:'m'、'm'和'Super-help ty'。午夜(00:00)在
df.head()中没有出现在我面前
因此,我认为在应用
df['hour'].dt.floor('h')
后出现了一些错误。但检查
df['hour']]并没有任何错误。loc[0]
显示了正确的小时截断。
df['dt2'] = df['dt'].apply(lambda x: x.replace(minute=0, second=0))
df.dt.index.to_period("h") # for the period
df.dt.index.to_period("h").to_timestamp() # for the timestamp truncated
ValueError: <YearEnd: month=12> is a non-fixed frequency