python - 将 dask 列转换为日期并应用 lambda 函数
问题描述
我有一个 csv 太大而无法读入内存,所以我试图使用 Dask 来解决我的问题。我是 Pandas 的普通用户,但缺乏使用 Dask 的经验。在我的数据中,我有一列“MONTHSTART”,我希望将其作为日期时间对象进行交互。但是,尽管我的代码在 Pandas 示例中工作,但我似乎无法从 Dask 数据帧中获得输出。
我已经在使用 dask 中阅读了我的 csv
df = dd.read_csv(filename, dtype='str')
然后我将列的 dtype 转换为 datetime 对象
def parse_dates(df):
return pd.to_datetime(df['MONTHSTART'], format='%d%b%Y')
meta = ('time', pd.Timestamp)
df.map_partitions(parse_dates, meta=meta)
最后我试图应用一个 lambda 函数来创建一个基于我的 datetime 列的新列
df['MONTHS_AGO'] = df.apply(
lambda y: (dt.date.today().year - y['MONTHSTART'].dt.year) * 12 +
(dt.date.today().month - y['MONTHSTART'].dt.month),
axis=1,
meta=meta)
我不确定这里使用元数据,没有它我的代码无法要求我指定元数据。
没有元我得到
ValueError: Metadata inference failed, please provide `meta` keyword
有了元我得到
AttributeError: ("'str' object has no attribute 'dt'", 'occurred at index 0')
我是否错误地处理了这个问题?在我缺少的 Dask 中应用 lambda 函数是否有技巧?
编辑:我混淆了这些信息,并删除了很多列。我试图保留足够的东西以解决问题。df.head(2).to_dict 示例:
{'AGE_1': {0: '57', 1: '57'},
'APREM': {0: '347.08581006', 1: '347.08581006'},
'BUSINESS_1': {0: 'COMPUTERSERVICES', 1: 'COMPUTERSERVICES'},
'COMPULSORYEXCESSAD': {0: '0', 1: '0'},
'COVERTYPE': {0: 'Comprehensive', 1: 'Comprehensive'},
'DRIVINGRESTRICTION': {0: 'IOD', 1: 'IOD'},
'EARNEDTECH': {0: '35.438383793', 1: '15.356632977'},
'ENDDATE': {0: '13AUG2017', 1: '13AUG2017'},
'EXPMONTH': {0: 'EVY01APR2017', 1: 'EVY01AUG2017'},
'INFORCEATEOM': {0: '1', 1: '0'},
'LICENCETYPE_1': {0: 'FullUKCarLicence', 1: 'FullUKCarLicence'},
'MARITALSTATUS_1': {0: 'Partnered', 1: 'Partnered'},
'MILEAGERESTRICTION': {0: '8000', 1: '8000'},
'MIN_AGE': {0: '57', 1: '57'},
'MIN_EXP': {0: '18', 1: '18'},
'MIN_EXP_AGE': {0: '57', 1: '57'},
'MIN_EXP_LICENCETYPE': {0: 'FullUKCarLicence', 1: 'FullUKCarLicence'},
'MONTHEND': {0: '30APR2017', 1: '31AUG2017'},
'MONTHSTART': {0: '01APR2017', 1: '01AUG2017'},
'REGION': {0: 'East Anglia', 1: 'East Anglia'},
'STARTDATE': {0: '16FEB2017', 1: '16FEB2017'},
'TENURE': {0: '4th Renewal', 1: '4th Renewal'},
'TotalIncurredExclRI': {0: nan, 1: nan},
'VEHICLECOUNT': {0: '1', 1: '1'},
'VEHICLEKEPTOVERNIGHT': {0: 'Drive', 1: 'Drive'},
'VEHICLEMODIFICATION': {0: 'false', 1: 'false'},
'VEHICLENUMBER': {0: '1', 1: '1'},
'VEHICLEUSAGE': {0: 'Personal Business Use', 1: 'Personal Business Use'},
'VOLUNTARYEXCESS': {0: '250', 1: '250'}}
解决方案
您可能想要重命名列并以您喜欢的格式转换日期,但这对我有用:
# First we create our df
import pandas as pd
import numpy as np
import dask.dataframe as dd
import datetime as dt
N = 10
df = pd.DataFrame({"date":pd.date_range(start='2017-01-01', periods=N),
"y":np.random.rand(N)})
df["date"] = df["date"].dt.strftime("%d%b%Y")
df.to_csv("data.csv", index=False)
然后
# read
df = dd.read_csv("data.csv", dtype='str')
# convert date to datetime
df["date"] = df["date"].astype("M8[us]")
# assign today date
td = dt.datetime.today()
# assign months_ago
df = df.assign(months_ago=((td.year - df["date"].dt.year)*12 +
td.month - df["date"].dt.month))
使用assign
你不需要处理meta
推荐阅读
- reactjs - DC.JS 数据网格渲染 React 组件
- java - Spring 5 安全 OAuth2 登录重定向循环
- d3.js - 如何在 D3.JS v3 中停止转换
- c# - Mediatr 无法解析 ASP.Net Core 中的 UserManager
- reactjs - 错误:无法读取未定义的属性“道具”
- css - Angular:组件样式不会级联到子组件?
- android - wifi 重新连接后,Android Paho Mqtt 不重新连接
- javascript - Angular8 - 无法迭代对象
- reactjs - 如何在 React 中添加 html
- javascript - 使用参数从 React Navigation 导航器内部调用组件函数