首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要将行组织的日期重新格式化为日期列,其中日期行之间的数据被指定为适当的日期。

需要将行组织的日期重新格式化为日期列,其中日期行之间的数据被指定为适当的日期。
EN

Stack Overflow用户
提问于 2019-05-22 16:15:45
回答 2查看 123关注 0票数 1

我正在处理一些组织不良的数据,这些数据记录了第1行(Y、M、D)中的日期,而下一个N行是按值(ID、value1、value2)组织的。

例如:

代码语言:javascript
复制
    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

我希望将日期行中的日期解析为日期时间格式(2018-10-2),然后将它们移到新的列中。

我想让它看起来像:

代码语言:javascript
复制
    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列是否包含一年),并将该行中的数据分割为以解析的日期时间格式命名的新文件。然后,在这个文件中,我可以读取文件名(已经被解析了),并使用这些数据创建一个新列。之后,我会将所有文件合并到一个内聚的数据集中。

我遇到的问题是,我无法弄清楚如何告诉熊猫,让它们倒行逆施,只在某一排分道扬镳。我的一个想法是将最后一次约会的index#写入一个变量,并将该行号上的数据分割为一个新文件,但我不知道如何从底部迭代它。此外,我知道这种方法非常混乱,我相信有一种更有效的方法来实现这一点。

关于识别日期列和解析日期的内容:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-22 16:32:23

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

  1. 首先提取日期行。
  2. 我们从以下三列创建日期:
  3. 我们将原始数据与新数据和forwardfill连接起来。
  4. 删除日期行的行。
代码语言:javascript
复制
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})')]
代码语言:javascript
复制
  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

Note

我使用column1column2column3作为列名。

票数 1
EN

Stack Overflow用户

发布于 2019-05-22 16:31:04

试试这个:

代码语言:javascript
复制
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)

输出

代码语言:javascript
复制
   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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56261116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档