在 Pandas 中从 datetime <[M8] 删除时间

Posted

技术标签:

【中文标题】在 Pandas 中从 datetime <[M8] 删除时间【英文标题】:Dropping time from datetime <[M8] in Pandas 【发布时间】:2014-09-07 07:14:34 【问题描述】:

所以我的数据框中有一个“日期”列,其中日期的格式如下

0    1998-08-26 04:00:00 

如果我只想要年份月份和日期,我该如何去掉琐碎的小时?

【问题讨论】:

明显/强制性的你尝试过什么? 随便df['Date'] = df['Date'].apply(lambda x: x.date()) 我尝试将所有内容都转换为字符串并进行迭代,但最后因为我需要将 df 作为 csv 我只使用了.to_csv(file, date_format = '%Y%m%d'。我也最终使用了@EdChum 解决方案,它也很有效! 请注意:@EdChum 的方法(就我而言)比下面接受的答案慢了大约 40 倍。 【参考方案1】:

最快的方法是使用 DatetimeIndex 的 normalize(首先需要将列设为 DatetimeIndex):

In [11]: df = pd.DataFrame("t": pd.date_range('2014-01-01', periods=5, freq='H'))

In [12]: df
Out[12]:
                    t
0 2014-01-01 00:00:00
1 2014-01-01 01:00:00
2 2014-01-01 02:00:00
3 2014-01-01 03:00:00
4 2014-01-01 04:00:00

In [13]: pd.DatetimeIndex(df.t).normalize()
Out[13]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2014-01-01, ..., 2014-01-01]
Length: 5, Freq: None, Timezone: None

In [14]: df['date'] = pd.DatetimeIndex(df.t).normalize()

In [15]: df
Out[15]:
                    t       date
0 2014-01-01 00:00:00 2014-01-01
1 2014-01-01 01:00:00 2014-01-01
2 2014-01-01 02:00:00 2014-01-01
3 2014-01-01 03:00:00 2014-01-01
4 2014-01-01 04:00:00 2014-01-01

DatetimeIndex 还有一些其他有用的属性,例如.year、.month、.day。


从 0.15 开始,它们将成为 dt 属性,因此您可以通过以下方式访问此(和其他方法):

df.t.dt.normalize()
# equivalent to
pd.DatetimeIndex(df.t).normalize()

【讨论】:

嗨,你能展示如何从日期时间中删除日期吗?使用datetime_column.dt.time 将使列作为对象不再是日期时间。 @rojas 你想要它是什么?时间增量? 嗯,好问题。我希望能够合并该时间列上的两个数据框(并且不希望它成为 str 对象并具有不同的格式)。 对于时间增量,一种方法是减去:df["date"] - df["date"].normalize() @CarlMorris 我猜是in "basics",但它也应该在时间序列中(它非常有用!)【参考方案2】:

另一种可能性是使用 str.split

df['Date'] = df['Date'].str.split(' ',expand=True)[0]

这应该将“日期”列拆分为标记为 0 和 1 的两列。使用日期和时间之间的空格作为拆分指示符。

返回的数据框的第 0 列包含日期,第 1 列包含时间。 然后它将原始数据框的“日期”列设置为列 [0],这应该只是日期。

【讨论】:

【参考方案3】:

另一种选择

df['my_date_column'].dt.date

愿意

0        2019-06-15
1        2019-06-15
2        2019-06-15
3        2019-06-15
4        2019-06-15

【讨论】:

我觉得我每隔几周就会回到你的答案,哈哈。希望我能给你不止一票。【参考方案4】:

read_csvdate_parser

to_date = lambda times : [t[0:10] for t in times]

df = pd.read_csv('input.csv', 
                  parse_dates=date: ['time'],
                  date_parser=to_date,
                  index_col='date')

【讨论】:

以上是关于在 Pandas 中从 datetime <[M8] 删除时间的主要内容,如果未能解决你的问题,请参考以下文章

将 pandas 系列的 dtype <- 'datetime64' 转换为 dtype <- 'np.int' 而无需迭代

在颤动中从地图<日期时间,列表>中删除项目

pandas中,类型为datetime.time,如何进行比较?

如何在 .net 核心中从 23/12/2021 05:31:25 将“DateTime.UtcNow”格式化为 23-12-2021-05-31-25 [关闭]

在 Pandas Python 中从 Excel 导入 [重复]

在 pandas.Series 中将时间戳转换为 datetime.datetime