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

时间:2019-09-08 23:18:31

标签: python sql pandas

我的sql数据库(tests.db)表(三角形)中有一列称为paydate的列。例如,其文本字段类似于'1/19/2019'。在另一列称为paymonth的列中,我想要类似'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 个答案:

答案 0 :(得分:0)

您可以使用熊猫将字符串日期时间转换为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时间序列(按datetime索引的数据框)方法按月(或季度,日或年...)分组并进行任何类型的操作聚合,甚至是时间序列上的滚动函数。下面的示例按月汇总付款列。

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())

enter image description here

参考: https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html

答案 1 :(得分:0)

pandas.to_datetimedt.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