我已将CSV文件导入到pandas DataFrame中,并且datetime64列的值如下:
2014-06-30 21:50:00
我只想删除时间或将时间设置为午夜:
2014-06-30 00:00:00
最简单的方法是什么?
答案 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()