Python 如何将Pandas数据帧中的字符串转换为';日期';数据类型?
我有一个熊猫数据框,其中一列包含格式为Python 如何将Pandas数据帧中的字符串转换为';日期';数据类型?,python,date,pandas,Python,Date,Pandas,我有一个熊猫数据框,其中一列包含格式为YYYY-MM-DD 例如,'2013-10-28' 此时,列的dtype是object 如何将列值转换为日期格式?使用 本质上相当于@waitingkuo,但我会在这里使用pd.to_datetime(它看起来更干净,并提供一些附加功能,例如dayfirst): 处理ValueErrors 如果你遇到这样的情况 df['time'] = pd.to_datetime(df['time']) 抛出 ValueError: Unknown string f
YYYY-MM-DD
例如,'2013-10-28'
此时,列的dtype
是object
如何将列值转换为日期格式?使用
本质上相当于@waitingkuo,但我会在这里使用
pd.to_datetime
(它看起来更干净,并提供一些附加功能,例如dayfirst
):
处理
ValueError
s如果你遇到这样的情况
df['time'] = pd.to_datetime(df['time'])
抛出
ValueError: Unknown string format
这意味着您有无效的(不可强制的)值。如果您同意将它们转换为pd.NaT
,则可以将errors='concurve'
参数添加到到_datetime
:
df['time'] = pd.to_datetime(df['time'], errors='coerce')
我想很多数据都来自CSV文件,在这种情况下,您只需在初始CSV读取期间转换日期即可:
dfcsv=pd.read\u csv('xyz.csv',parse\u dates=[0])
其中0表示日期所在的列。如果希望将日期作为索引,也可以在其中添加
,index_col=0
请参见现在您可以执行
df['column'].dt.date
请注意,对于datetime对象,如果看不到它们都是00:00:00的时间,则这不是时间。这就是iPython笔记本,它试图让事情看起来漂亮 可能需要将日期转换为不同的频率。在这种情况下,我建议按日期设置索引
#set an index by dates
df.set_index(['time'], drop=True, inplace=True)
在此之后,您可以更轻松地转换为最需要的日期格式类型。下面,我按顺序转换为多种日期格式,最终在月初得到一组每日日期
#Convert to daily dates
df.index = pd.DatetimeIndex(data=df.index)
#Convert to monthly dates
df.index = df.index.to_period(freq='M')
#Convert to strings
df.index = df.index.strftime('%Y-%m')
#Convert to daily dates
df.index = pd.DatetimeIndex(data=df.index)
为简洁起见,我不会在上面的每一行之后运行以下代码:
print(df.index)
print(df.index.dtype)
print(type(df.index))
这为我提供了以下输出:
Index(['2013-01-01', '2013-01-02', '2013-01-03'], dtype='object', name='time')
object
<class 'pandas.core.indexes.base.Index'>
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03'], dtype='datetime64[ns]', name='time', freq=None)
datetime64[ns]
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>
PeriodIndex(['2013-01', '2013-01', '2013-01'], dtype='period[M]', name='time', freq='M')
period[M]
<class 'pandas.core.indexes.period.PeriodIndex'>
Index(['2013-01', '2013-01', '2013-01'], dtype='object')
object
<class 'pandas.core.indexes.base.Index'>
DatetimeIndex(['2013-01-01', '2013-01-01', '2013-01-01'], dtype='datetime64[ns]', freq=None)
datetime64[ns]
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>
索引(['2013-01-01'、'2013-01-02'、'2013-01-03'],dtype='object',name='time')
对象
DatetimeIndex(['2013-01-01','2013-01-02','2013-01-03'],dtype='datetime64[ns]',name='time',freq=None)
日期时间64[ns]
周期索引(['2013-01','2013-01','2013-01','dtype='period[M]',name='time',freq='M')
周期[M]
索引(['2013-01','2013-01','2013-01'],数据类型='object')
对象
DatetimeIndex(['2013-01-01','2013-01-01','2013-01-01'],dtype='datetime64[ns]',freq=None)
日期时间64[ns]
另一种方法,如果您有多个列要转换为datetime,那么这种方法很有效
cols = ['date1','date2']
df[cols] = df[cols].apply(pd.to_datetime)
如果要获取日期而不是日期时间格式:
df["id_date"] = pd.to_datetime(df["id_date"]).dt.date
尝试使用pd.to_datetime函数将其中一行转换为时间戳,然后使用.map将公式映射到整个列为完整起见,另一个选项可能不是最简单的选项,与@SSS建议的选项有点类似,但使用datetime库是:
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 startDay 110526 non-null object
1 endDay 110526 non-null object
import pandas as pd
df['startDay'] = pd.to_datetime(df.startDay)
df['endDay'] = pd.to_datetime(df.endDay)
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 startDay 110526 non-null datetime64[ns]
1 endDay 110526 non-null datetime64[ns]
import datetime
df["Date"] = df["Date"].apply(lambda x: datetime.datetime.strptime(x, '%Y-%d-%m').date())
很好-谢谢-我如何在每次约会结束时去掉00:00:00?熊猫的时间戳既有日期又有时间。您的意思是将其转换为python日期对象吗?您可以通过
df['time']=[time.date()转换为df['time']]]
将[ns]转换为什么意思,您可以将文本字符串设置为日期并删除该日期的时间部分吗?@Yoshisery这是纳秒,并且是正确转换后在引擎盖下存储日期的方式(以纳秒为单位的历元时间).嗨,伙计们,@AndyHayden你能从日期中删除时间部分吗?我不需要那个部分?在pandas'0.13.1中,尾随的00:00:00不显示。在其他版本中,我们如何删除/和/或不显示它们呢?我认为这不是一个好方法,有讨论添加日期格式,如float\u格式(你已经看到)。我还是建议升级。我的问题是我的日期是这种格式…41516.43,我得到了这个错误。我希望它在新列中返回类似2014-02-03的内容?!错误:#将“加载日期”列中的日期值转换为日期预算数据集['date_last_load']=pd.到日期时间(预算数据集['load_date'))budget_dataset-c:2:SettingWith CopyWarning:试图在数据帧切片的副本上设置一个值。尝试使用.loc[row_index,col_indexer]=值而不是此值。此项不适用于我,它抱怨:只能使用具有datetimelike值的.dt访问器您可能必须执行df[col]=pd.to_datetime(df[col])
首先将列转换为日期时间对象。这个答案的问题是,它将列转换为dtype=object
,这比pandas中的真实datetime dtype
占用的内存要多得多。.dt.date
绝对不应与任何大型数据集一起使用,因为:(1)它使用数据类型对象
,如果数据集很大(有2亿行或更多行),则在熊猫中很难使用该对象(2)fastparquet
无法将其写入拼花地板。此人没有说任何关于数据集大小或拼花地板的内容。问题是询问日期而不是日期时间。@MarkAndersen只要您的列中只有date
值,转换为日期时间将只保留相关信息。如果您明确转换为我们ingdf['datetime\u col'].dt.date
将导致对象
dtype;内存管理中的丢失。没有理由使用。考虑到直接使用pd,在此处应用
。to_datetime
有效。谢谢,这正是我所需要的。文档已移动,但是,您可以在此处找到:.dt.date
绝对不应该可以与任何大小的数据集一起使用,因为:(1)如果数据集很大(有2亿行或更多行),它使用dtypeobject
,这在熊猫中很难使用)(2)它无法通过fastparquet
写入parquet。不,这会将其转换为“datetime64[ns]”类型而不是“date”类型。Thos
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 startDay 110526 non-null object
1 endDay 110526 non-null object
import pandas as pd
df['startDay'] = pd.to_datetime(df.startDay)
df['endDay'] = pd.to_datetime(df.endDay)
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 startDay 110526 non-null datetime64[ns]
1 endDay 110526 non-null datetime64[ns]
import datetime
df["Date"] = df["Date"].apply(lambda x: datetime.datetime.strptime(x, '%Y-%d-%m').date())