从 Pandas 数据框列中删除“秒”和“分钟”
Posted
技术标签:
【中文标题】从 Pandas 数据框列中删除“秒”和“分钟”【英文标题】:Remove 'seconds' and 'minutes' from a Pandas dataframe column 【发布时间】:2017-09-10 01:14:56 【问题描述】:给定一个如下的数据框:
import numpy as np
import pandas as pd
df = pd.DataFrame(
'Date' : pd.date_range('1/1/2011', periods=5, freq='3675S'),
'Num' : np.random.rand(5))
Date Num
0 2011-01-01 00:00:00 0.580997
1 2011-01-01 01:01:15 0.407332
2 2011-01-01 02:02:30 0.786035
3 2011-01-01 03:03:45 0.821792
4 2011-01-01 04:05:00 0.807869
我想删除“分钟”和“秒”信息。
以下内容(大部分来自:How to remove the 'seconds' of Pandas dataframe index?)工作正常,
df = df.assign(Date = lambda x: pd.to_datetime(x['Date'].dt.strftime('%Y-%m-%d %H')))
Date Num
0 2011-01-01 00:00:00 0.580997
1 2011-01-01 01:00:00 0.407332
2 2011-01-01 02:00:00 0.786035
3 2011-01-01 03:00:00 0.821792
4 2011-01-01 04:00:00 0.807869
但是将日期时间转换为字符串然后再转换回日期时间感觉很奇怪。有没有办法更直接地做到这一点?
【问题讨论】:
【参考方案1】:dt.round
这应该是怎么做的...使用dt.round
df.assign(Date=df.Date.dt.round('H'))
Date Num
0 2011-01-01 00:00:00 0.577957
1 2011-01-01 01:00:00 0.995748
2 2011-01-01 02:00:00 0.864013
3 2011-01-01 03:00:00 0.468762
4 2011-01-01 04:00:00 0.866827
老答案
一种方法是设置索引并使用resample
df.set_index('Date').resample('H').last().reset_index()
Date Num
0 2011-01-01 00:00:00 0.577957
1 2011-01-01 01:00:00 0.995748
2 2011-01-01 02:00:00 0.864013
3 2011-01-01 03:00:00 0.468762
4 2011-01-01 04:00:00 0.866827
另一种选择是剥离 date
和 hour
组件
df.assign(
Date=pd.to_datetime(df.Date.dt.date) +
pd.to_timedelta(df.Date.dt.hour, unit='H'))
Date Num
0 2011-01-01 00:00:00 0.577957
1 2011-01-01 01:00:00 0.995748
2 2011-01-01 02:00:00 0.864013
3 2011-01-01 03:00:00 0.468762
4 2011-01-01 04:00:00 0.866827
【讨论】:
原来dt.floor
对我的情况更好,尽管我希望dt.round
总体上更好。 -谢谢
注意:2030-01-01 21:54:00 的回合是 2030-01-01 22:00:00 而不是 2030-01-01 21:00:00 --- to这样做使用 dt.floor
或者:df.Date = df.Date.dt.floor('H')【参考方案2】:
其他解决方案可能是这样的:
df.Date = pd.to_datetime(df.Date)
df.Date = df.Date.apply(lambda x: datetime(x.year, x.month, x.day, x.hour))
【讨论】:
以上是关于从 Pandas 数据框列中删除“秒”和“分钟”的主要内容,如果未能解决你的问题,请参考以下文章