Pandas 0.15 DataFrame:删除或重置datetime64的时间部分

时间:2014-10-23 15:01:32

标签: python pandas

我已将CSV文件导入到pandas DataFrame中,并且datetime64列的值如下:

2014-06-30 21:50:00

我只想删除时间或将时间设置为午夜:

2014-06-30 00:00:00 

最简单的方法是什么?

6 个答案:

答案 0 :(得分:12)

为此,Pandas有一个内置函数pd.datetools.normalize_date

df['date_col'] = df['date_col'].apply(pd.datetools.normalize_date)

' implemented in Cython并执行以下操作:

if PyDateTime_Check(dt):
    return dt.replace(hour=0, minute=0, second=0, microsecond=0)
elif PyDate_Check(dt):
    return datetime(dt.year, dt.month, dt.day)
else:
    raise TypeError('Unrecognized type: %s' % type(dt))

答案 1 :(得分:4)

使用dt方法,这些方法被矢量化以产生更快的结果。

# There are better ways of converting it in to datetime column. 
# Ignore those to keep it simple
data['date_column'] = pd.to_datetime(data['date_column'])
data['date_column'].dt.date

答案 2 :(得分:2)

我可以考虑两种方法,只在date()属性设置或分配新列,或在datetime对象上调用replace并传递参数hour=0, minute=0

In [106]:
# example data
t = """datetime
2014-06-30 21:50:00"""
df = pd.read_csv(io.StringIO(t), parse_dates=[0])
df
Out[106]:
             datetime
0 2014-06-30 21:50:00
In [107]:
# apply a lambda accessing just the date() attribute
df['datetime'] = df['datetime'].apply( lambda x: x.date() )
print(df)
# reset df
df = pd.read_csv(io.StringIO(t), parse_dates=[0])
# call replace with params hour=0, minute=0
df['datetime'] = df['datetime'].apply( lambda x: x.replace(hour=0, minute=0) )
df

     datetime
0  2014-06-30
Out[107]:
    datetime
0 2014-06-30

答案 3 :(得分:0)

我发现剥离一切的最快方法,但日期是使用熊猫时间戳的底层Numpy结构。

import pandas as pd
dates = pd.to_datetime(['1990-1-1 1:00:11',
                        '1991-1-1',
                        '1999-12-31 12:59:59.999'])
dates

DatetimeIndex(['1990-01-01 01:00:11', '1991-01-01 00:00:00',
           '1999-12-31 12:59:59.999000'],
           dtype='datetime64[ns]', freq=None)

dates = dates.astype(np.int64)
ns_in_day = 24*60*60*np.int64(1e9)
dates //= ns_in_day
dates *= ns_in_day
dates = dates.astype(np.dtype('<M8[ns]'))
dates = pd.Series(dates)
dates

0   1990-01-01
1   1991-01-01
2   1999-12-31
dtype: datetime64[ns]

当数据有时区信息时,这可能不起作用。

答案 4 :(得分:0)

pd.datetools.normalize_date已被弃用。请改用df['date_col'] = df['date_col'].dt.normalize()

请参阅https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.dt.normalize.html

答案 5 :(得分:0)

由于pd.datetools.normalize_date已被弃用,并且您正在使用datetime64数据类型,请使用:

df.your_date_col = df.your_date_col.apply(lambda x: x.replace(hour=0, minute=0, second=0, microsecond=0))

这样,您无需先转换为日期时间的熊猫。如果已经是大熊猫的约会时间,请查看Phil的回答。

df.your_date_col = df.your_date_col.dt.normalize()