需要将按行组织的日期重新格式化为日期列,其中为日期行之间的数据分配了适当的日期

时间:2019-05-22 16:15:46

标签: python pandas iteration

我正在处理一些整理得不好的数据,这些数据记录第1行(Y,M,D)中的日期,而接下来的N行则按值(ID,value1,value2)进行整理

例如:

    column1  column2 column3
    2018     10      2
    ID01     a       1
    ID02     b       4
    ID03     c       2
    2018     10      3
    ID01     d       7
    ID02     e       6
    ID03     f       1

我想将日期行中的日期解析为datetime格式(2018-10-2),而是将其移动到新列中。

我希望它看起来像什么

    column1  column2  column3  date
    ID01     a        1        2018-10-2
    ID02     b        4        2018-10-2
    ID03     c        2        2018-10-2
    ID01     d        7        2018-10-3    
    ID02     e        6        2018-10-3
    ID03     f        1        2018-10-3

我尝试的一种方法是从文件末尾开始工作,检测日期行(通过检查第1列是否包含年份),然后将该行的数据帧拆分为以解析的日期时间命名的新文件格式。然后,在该文件中,我可以读取文件名(已解析)并仅使用此数据创建一个新列。然后,我将所有文件合并在一起,成为一个内聚的数据集。

我遇到的问题是我无法弄清楚如何告诉熊猫既向后工作又仅在特定行分开。我的一个想法是将最后一个日期的索引号写到一个变量中,并将该行号的数据框拆分到一个新文件中,但是我不知道如何从底部进行迭代。此外,我知道这种方法非常凌乱,并且我相信有一种更有效的方法可以实现这一目标。

我所能识别的日期列和解析日期:

years = [2015,2016,2017,2018]
df['year?'] = df['column1'].isin(years).astype(int) # Detect date row

if df['year?'] == 1: # I receive errors here
    # Parse dates here
    datedf = (df['column1'].astype(str))+(df['column2'].astype(str))+(df['column3'].astype(str))
    df['date'] = pd.to_datetime(datedf, format='%Y%m%d') # Write date to 'date' column

2 个答案:

答案 0 :(得分:1)

尝试一下:

df = pd.DataFrame([[2018,10,2],['ID01','a',1],['ID02','b',4],['ID03','c',2],[2018,10,3],['ID01','d',7],['ID02','e',6],['ID03','f',1]])

data = []

for index, row in df.iterrows():
    if isinstance(row[0], int):
        dt = pd.to_datetime('{}-{}-{}'.format(row[0],row[1],row[2]))
    else:
        data.append([row[0],row[1],row[2],dt])

df = pd.DataFrame(data)

输出

   0  1  2          3
0  ID01  a  1 2018-10-02
1  ID02  b  4 2018-10-02
2  ID03  c  2 2018-10-02
3  ID01  d  7 2018-10-03
4  ID02  e  6 2018-10-03
5  ID03  f  1 2018-10-03

答案 1 :(得分:1)

我们可以通过几个步骤解决此问题:

  1. 首先我们提取日期行
  2. 我们从三列中创建一个日期:
  3. 我们将原始数据框与新数据框和forwardfill
  4. 连接起来
  5. 我们删除日期行
  6. 中的行
df2 = df[df['column1'].str.match('(\d{4})')]

df2['date'] = pd.to_datetime(df2['column1'].astype(str) + df2['column2'].astype(str) + df2['column3'].astype(str), format='%Y%m%d')

df_final = pd.concat([df[~df['column1'].str.match('(\d{4})')], df2]).sort_index().ffill()

df_final = df_final[~df_final['column1'].str.match('(\d{4})')]

  column1 column2  column3       date
1    ID01       a        1 2018-10-02
2    ID02       b        4 2018-10-02
3    ID03       c        2 2018-10-02
5    ID01       d        7 2018-10-03
6    ID02       e        6 2018-10-03
7    ID03       f        1 2018-10-03

注意

我使用column1column2column3作为列名