Pandas Dataframe将YYYYMM格式拆分为列

wbrvyc0a  于 11个月前  发布在  其他
关注(0)|答案(4)|浏览(78)

我有一个数据集,其中包含一个以YYYYMM格式存储数据的列。在研究失败后(我不知道如何将日期时间应用于此),我创建了一个帮助函数来手动拆分它,并使用.apply()函数将该函数应用于每一行。然而,这花费了大量的时间,我不禁相信有一种更好的方法可以做到这一点。
任何援助是赞赏。

def splitYearMonth (date:int):
    date = str(date)
    date = list(date)
    yearList = date[:4]
    year = ''
    year = year.join(yearList)
    year = int(year)
    monthList = date[-2:]
    month = ''
    month = month.join(monthList)
    month = int(month)
    return year, month

个字符

rpppsulh

rpppsulh1#

试试看:

# convert to string if necessary:
df["YYYYMM"] = df["YYYYMM"].astype(str)

df["Year"], df["Month"] = df["YYYYMM"].str[:4], df["YYYYMM"].str[4:]

print(df)

字符串
打印:

YYYYMM  Year Month
0  200101  2001    01
1  200102  2001    02
2  201012  2010    12

mpgws1up

mpgws1up2#

几个建议:
1.使用datetime.strpftime

>>> from datetime import datetime
>>> datetime.strptime('20231202', '%Y%m%d')
datetime.datetime(2023, 12, 2, 0, 0)

字符串
1.使用dateutil.parser

>>> import dateutil.parser
>>> dateutil.parser.parse('20231202')
datetime.datetime(2023, 12, 2, 0, 0)

qvk1mo1f

qvk1mo1f3#

我希望这将工作:

def splitYearMonth (date):
    date = pd.to_datetime(date, format='%Y%m')
    year = date.year
    month = date.month
    return year, month

字符串

xtfmy6hx

xtfmy6hx4#

你的猜测是正确的,使用apply()与自定义函数并不是最快的方法。向量化操作(即一次应用于整个数据列的操作)在许多情况下要快几个数量级。引用following website
向量化比循环/迭代和应用快得多的原因是它不是每次都计算整行,而是将参数应用于整个数据集。向量化是一次将操作应用于整个数据数组的过程,而不是单独操作数组的每个元素。这允许更有效地使用内存和CPU资源。
当使用Loops或Apply对Pandas数据框执行计算时,操作将按顺序应用。这会导致重复访问内存、计算和更新值,这可能会导致速度缓慢和资源密集型。
另一方面,向量化操作在Cython(C或C++中的Python)中实现,并利用CPU的向量处理能力,可以一次执行多个操作,通过同时计算多个参数进一步提高性能。向量化操作还避免了不断访问内存的开销,这是循环和应用的支柱。
矢量化代码在实践中是什么样子的?例如:

import pandas as pd

# Initialize example dataframe
df = pd.DataFrame({"YYYYMM": [
    "202203",
    "202204",
    "202206",
    "202302",
    "202307",
]})

# Perform split
df["YYYYMM"] = df["YYYYMM"].astype(str)
df["year"] = df["YYYYMM"].str[:4]
df["month"] = df["YYYYMM"].str[4:]

print(df)

字符串
它打印:

YYYYMM  year month
0  202203  2022    03
1  202204  2022    04
2  202206  2022    06
3  202302  2023    02
4  202307  2023    07

相关问题