为了账号安全,请及时绑定邮箱和手机立即绑定

将文本日期转换为年+月进行排序(即 1/19/2019 到 201901)

将文本日期转换为年+月进行排序(即 1/19/2019 到 201901)

狐的传说 2022-05-24 12:44:30
我的 sql 数据库(tests.db)表(三角形)中有一个名为paiddate 的列。例如,它是一个看起来像的文本字段'1/19/2019'。在另一个名为paidmonth 的列中,我想要类似的东西'201901',这将允许我按年和月对数据进行排序。我试过 -def getYearMonth(s):   return s.split("/")[0]+"-"+s.split("/")[2]df['paidmonth']= df['paiddate'].apply(lambda x: getYearMonth(x))这给了我 1-2019,看起来不错,但没有按日期排序。它按数字排序。所以 1-2019 将在 1-2018 之后,而不是 12-2018 之后。
查看完整描述

2 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

您可以使用 pandas 将字符串日期时间转换为 datetime64 类型。它足够聪明,可以通过检查字符串来推断格式(月优先或日优先)。您可以为其提供一个格式化程序,它可以加速它,这是一个非常大的数据集的限制器。


import pandas as pd


# Make some unsorted dates as strings in a dataframe

df = pd.DataFrame({

    'dates': ['1/19/2019', '1/12/2019', '12/1/2019', '6/7/2019', '7/6/2019']

})


# create a new column that converts the string to a datetime64

df['paidmonth'] = pd.to_datetime(df['dates'])


# sort the data

df.sort_values('paidmonth', inplace=True)

df

答案 2:


好的,如果您只想创建一个单独的年月列,您可以先将字符串转换为日期(如第一个答案),然后使用 .dt.period() 将该日期设为年月.


保留完整日期有一些优点,因为您可以使用 pandas 时间序列(按日期时间索引的数据框)方法按月(或季度、日或年...)分组并进行任何类型的聚合,或者甚至是时间序列上的滚动函数。下面的示例按月汇总付款列。


import pandas as pd

import numpy as np


n=400

df = pd.DataFrame({

    'Date': pd.date_range('2018-01-01', periods=n, freq='d'),

    'Payment': np.random.randint(20, 500, n)

})


# Make a column that is only the year and month

df['year-month'] = ts['Date'].dt.to_period('M') 

display(df.head())


# use the full date column to group by month ans sum the payments 

df_bymonth = df.set_index('Date').resample('m').apply({'Payment': 'sum'})

display(df_bymonth.head())

//img1.sycdn.imooc.com//628c62c800012ba504920622.jpg

查看完整回答
反对 回复 2022-05-24
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

pandas.to_datetime与 一起使用dt.strftime:


import pandas as pd


df = pd.DataFrame()

df['col1'] = ['%s/19/2019' % i for i in range(1, 10)]

样本数据:


        col1

0  1/19/2019

1  2/19/2019

2  3/19/2019

3  4/19/2019

4  5/19/2019

5  6/19/2019

6  7/19/2019

7  8/19/2019

8  9/19/2019

使用pd.to_datetime:


df['col2'] = pd.to_datetime(df['col1']).dt.strftime('%Y%m')

print(df)

输出:


        col1    col2

0  1/19/2019  201901

1  2/19/2019  201902

2  3/19/2019  201903

3  4/19/2019  201904

4  5/19/2019  201905

5  6/19/2019  201906

6  7/19/2019  201907

7  8/19/2019  201908

8  9/19/2019  201909


查看完整回答
反对 回复 2022-05-24
  • 2 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号