Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将Pandas数据帧中的字符串转换为';日期';数据类型?_Python_Date_Pandas - Fatal编程技术网

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
值,转换为日期时间将只保留相关信息。如果您明确转换为我们ing
df['datetime\u col'].dt.date
将导致
对象
dtype;内存管理中的丢失。没有理由使用
。考虑到直接使用
pd,在此处应用
。to_datetime
有效。谢谢,这正是我所需要的。文档已移动,但是,您可以在此处找到:
.dt.date
绝对不应该可以与任何大小的数据集一起使用,因为:(1)如果数据集很大(有2亿行或更多行),它使用dtype
object
,这在熊猫中很难使用)(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())