如何加速 DatetimeIndex 处理?

3

我有一个很大的pandas DataFrame(大约1050000个条目)。其中一列是datetime类型。我想提取年份、月份和星期几。问题在于下面显示的代码非常慢:

df['Year'] = pd.DatetimeIndex(df.Date).year
df['Month'] = pd.DatetimeIndex(df.Date).month
df['Weekday'] = pd.DatetimeIndex(df.Date).weekday

更新:
数据看起来像这样:

Update:

数据看起来像这样:

      Id  DayOfWeek       Date
0      1          5 2015-07-31   
1      2          4 2015-07-30   
2      3          3 2015-07-29   
3      4          2 2015-07-28  
4      5          1 2015-07-27 

如果我这样做:
df = pd.read_csv("data.csv", parse_dates=[2])

df['Year'] = pd.to_datetime(df['Date']).year
df['Month'] = pd.to_datetime(df['Date']).month
df['Weekday'] = pd.to_datetime(df['Date']).weekday

那么错误就是:

AttributeError: 'Series' object has no attribute 'year'
2个回答

3
您表达了您的列已经是 datetime64 类型。在这种情况下,您可以简单地使用 .dt accessor 来公开与该列中的日期时间值相关联的方法和属性:
df['Year'] = df.Date.dt.year

这比编写 pd.DatetimeIndex(df.Date).year 要快得多,因为它首先会创建一个全新的索引对象。


啊 - 那么你的数据中并没有datetime64类型的列。你需要将该列转换为datetime类型;你可以使用qmorgan的回答中提到的df['Date'] = pd.to_datetime(df['Date'])来进行转换。 - Alex Riley
然后它会显示 ValueError: New date column already in dict Date... 我是这样读取 csv 文件的:df = pd.read_csv("data.csv", dtype=dtypestrain),其中 dtypestrain = {'Id': int, 'DayOfWeek': int, 'Date': dt.datetime}。 - Klausos Klausos
同时也出现了 AttributeError: 'module' 对象没有 'parsedDate' 属性。 - Klausos Klausos
最好让read_csv推断列的数据类型,这样会更容易。尝试使用pd.read_csv("data.csv", parse_dates=[2]),让函数在读取数据时解析日期时间值。 - Alex Riley
请问您能否看一下我的更新?我已经发布了代码和问题。 - Klausos Klausos
显示剩余2条评论

2

看起来你可能是每次都解析日期,而不是一次性解析。此外,使用to_datetime()方法可能会更快。

尝试

df['parsedDate'] = pd.to_datetime(df['Date'])
df['Year'] = pd.parsedDate.year
df['Month'] = pd.parsedDate.month
df['Weekday'] = pd.parsedDate.weekday

它显示 ValueError: New date column already in dict Date... 我是这样读取 csv 文件的:df = pd.read_csv("data.csv", dtype=dtypestrain),其中 dtypestrain = {'Id': int, 'DayOfWeek': int, 'Date': dt.datetime}。 - Klausos Klausos
或 AttributeError: 'module' 对象没有属性 'parsedDate'。 - Klausos Klausos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接