我有一个字段在熊猫DataFrame导入字符串格式。 它应该是一个datetime变量。如何将其转换为datetime列,然后根据日期进行筛选。
例子:
df = pd.DataFrame({'date': ['05SEP2014:00:00:00.000']})
我有一个字段在熊猫DataFrame导入字符串格式。 它应该是一个datetime变量。如何将其转换为datetime列,然后根据日期进行筛选。
例子:
df = pd.DataFrame({'date': ['05SEP2014:00:00:00.000']})
当前回答
使用pandas to_datetime函数将列解析为DateTime。此外,通过使用infer_datetime_format=True,它将自动检测格式并将提到的列转换为DateTime。
import pandas as pd
raw_data['Mycol'] = pd.to_datetime(raw_data['Mycol'], infer_datetime_format=True)
其他回答
静音SettingWithCopyWarning
如果你得到这个警告,那么这意味着你的数据帧可能是通过过滤另一个数据帧创建的。在任何任务之前复制你的数据框架,你就可以开始了。
df = df.copy()
df['date'] = pd.to_datetime(df['date'], format='%d%b%Y:%H:%M:%S.%f')
Errors ='coerce'是有用的
如果某些行格式不正确,或者根本没有datetime, errors= parameter非常有用,这样您就可以转换有效的行,并在以后处理包含无效值的行。
df['date'] = pd.to_datetime(df['date'], format='%d%b%Y:%H:%M:%S.%f', errors='coerce')
# for multiple columns
df[['start', 'end']] = df[['start', 'end']].apply(pd.to_datetime, format='%d%b%Y:%H:%M:%S.%f', errors='coerce')
设置正确的格式=比让熊猫发现要快得多
长话短说,从chrisb的帖子中开始传递正确的格式=比让pandas找出格式要快得多,特别是如果格式包含时间组件。对于大于10k行的数据帧,运行时的差异是巨大的(大约快25倍,所以我们说的是几分钟vs几秒)。所有有效的格式选项都可以在https://strftime.org/上找到。
1用于生成timeit测试图的代码。
import perfplot
from random import choices
from datetime import datetime
mdYHMSf = range(1,13), range(1,29), range(2000,2024), range(24), *[range(60)]*2, range(1000)
perfplot.show(
kernels=[lambda x: pd.to_datetime(x),
lambda x: pd.to_datetime(x, format='%m/%d/%Y %H:%M:%S.%f'),
lambda x: pd.to_datetime(x, infer_datetime_format=True),
lambda s: s.apply(lambda x: datetime.strptime(x, '%m/%d/%Y %H:%M:%S.%f'))],
labels=["pd.to_datetime(df['date'])",
"pd.to_datetime(df['date'], format='%m/%d/%Y %H:%M:%S.%f')",
"pd.to_datetime(df['date'], infer_datetime_format=True)",
"df['date'].apply(lambda x: datetime.strptime(x, '%m/%d/%Y %H:%M:%S.%f'))"],
n_range=[2**k for k in range(20)],
setup=lambda n: pd.Series([f"{m}/{d}/{Y} {H}:{M}:{S}.{f}"
for m,d,Y,H,M,S,f in zip(*[choices(e, k=n) for e in mdYHMSf])]),
equality_check=pd.Series.equals,
xlabel='len(df)'
)
就像我们将对象数据类型转换为float或int。使用astype ()
raw_data['Mycol']=raw_data['Mycol'].astype('datetime64[ns]')
如果你有一个以上的列转换,你可以做以下:
df[["col1", "col2", "col3"]] = df[["col1", "col2", "col3"]].apply(pd.to_datetime)
使用pandas to_datetime函数将列解析为DateTime。此外,通过使用infer_datetime_format=True,它将自动检测格式并将提到的列转换为DateTime。
import pandas as pd
raw_data['Mycol'] = pd.to_datetime(raw_data['Mycol'], infer_datetime_format=True)
克里斯的答案是正确的:
raw_data['Mycol'] = pd。to_datetime (raw_data [' Mycol '],格式= ' Y % d % b %: % H: % M: % s % f ')
但是它会导致Python警告 一个值正试图从数据帧(DataFrame)中设置一个片的副本。 尝试使用.loc[row_indexer,col_indexer] = value代替
我猜这是由于一些链索引。