Python:将列转换为日期格式并提取顺序

Python:将列转换为日期格式并提取顺序,python,date,datetime,converter,Python,Date,Datetime,Converter,我请求帮助将值转换为日期格式 我有以下数据结构: ID ACT1 ACT2 ACT3 ACT4 1 154438.0 154104.0 155321.0 155321.0 2 154042.0 154073.0 154104.0 154104.0 ... ACT1-4列中的数字需要转换。某些行包含NaN值 我发现以下函数帮助我获取公历日期: from datetime import datetime, ti

我请求帮助将值转换为日期格式

我有以下数据结构:

ID  ACT1        ACT2        ACT3        ACT4
1   154438.0    154104.0    155321.0    155321.0
2   154042.0    154073.0    154104.0    154104.0
...
ACT1-4列中的数字需要转换。某些行包含NaN值

我发现以下函数帮助我获取公历日期:

from datetime import datetime, timedelta
gregorian = datetime.strptime('1582/10/15', "%Y/%m/%d")
modified_date = gregorian + timedelta(days=154438)
datetime.strftime(modified_date, "%Y/%m/%d")
了解如何将此转换应用于除“ID”之外的所有列,以及该方法是否正确(或可以改进),将是非常好的

应用转换后,我需要提取列项目的顺序,按日期升序排序。比如说

ID ORDER
1  ACT1, ACT3, ACT4, ACT2
2  ACT2, ACT1, ACT3, ACT4

谢谢大家!

听起来你这里有两个问题

1) 要更改为日期时间:

cols = [col for col in df.columns if col != 'ID']
df.loc[:, cols] = df.loc[:, cols].applymap(lambda x: datetime.strptime('1582/10/15', "%Y/%m/%d") + timedelta(days=x) if np.isfinite(x) else x)
2) 要获取已排序的列名,请执行以下操作:

df['ORDER'] = df.loc[:, cols].apply(lambda dr: ','.join(df.loc[:, cols].columns[dr.dropna().argsort()]), axis=1)

注意:上面的dropna将从订单字符串中省略带有NaT值的列。

听起来您这里有两个问题

1) 要更改为日期时间:

cols = [col for col in df.columns if col != 'ID']
df.loc[:, cols] = df.loc[:, cols].applymap(lambda x: datetime.strptime('1582/10/15', "%Y/%m/%d") + timedelta(days=x) if np.isfinite(x) else x)
2) 要获取已排序的列名,请执行以下操作:

df['ORDER'] = df.loc[:, cols].apply(lambda dr: ','.join(df.loc[:, cols].columns[dr.dropna().argsort()]), axis=1)

注意:上面的dropna将从订单字符串中省略具有NaT值的列。

首先,我将使输入列逗号分隔,以便更容易处理表单:

ID,ACT1,ACT2,ACT3,ACT4
1,154438.0,154104.0,155321.0,155321.0
2,154042.0,154073.0,154104.0,154104.0
然后,您可以使用CSV阅读器读取每一行,提取以列名为键的键、值对。然后从字典中弹出ID以获取其值,即1、2等,然后可以根据日期值重新排序。代码如下:

#!/usr/bin/env python3

import csv
from operator import itemgetter

idAndTuple = {}
with open('time.txt') as csvfile:
  reader = csv.DictReader(csvfile)
  for row in reader:
    myID = row.pop('ID',None)
    reorderedList = sorted(row.items(), key = itemgetter(1))
    idAndTuple[myID] = reorderedList
    print( myID, reorderedList )
运行此操作时的结果是:

1 [('ACT2', '154104.0'), ('ACT1', '154438.0'), ('ACT3', '155321.0'), ('ACT4', '155321.0')]
2 [('ACT1', '154042.0'), ('ACT2', '154073.0'), ('ACT3', '154104.0'), ('ACT4', '154104.0')]

我想这就是您要找的。

首先,我要将输入列用逗号分隔,以便更容易处理表单:

ID,ACT1,ACT2,ACT3,ACT4
1,154438.0,154104.0,155321.0,155321.0
2,154042.0,154073.0,154104.0,154104.0
然后,您可以使用CSV阅读器读取每一行,提取以列名为键的键、值对。然后从字典中弹出ID以获取其值,即1、2等,然后可以根据日期值重新排序。代码如下:

#!/usr/bin/env python3

import csv
from operator import itemgetter

idAndTuple = {}
with open('time.txt') as csvfile:
  reader = csv.DictReader(csvfile)
  for row in reader:
    myID = row.pop('ID',None)
    reorderedList = sorted(row.items(), key = itemgetter(1))
    idAndTuple[myID] = reorderedList
    print( myID, reorderedList )
运行此操作时的结果是:

1 [('ACT2', '154104.0'), ('ACT1', '154438.0'), ('ACT3', '155321.0'), ('ACT4', '155321.0')]
2 [('ACT1', '154042.0'), ('ACT2', '154073.0'), ('ACT3', '154104.0'), ('ACT4', '154104.0')]


我想这就是您要找的。

当列已经是数字时,为什么还要应用日期函数呢?我需要查看实际日期。我想您对第二列的顺序是错误的。也是第一次column@Christopher您声明希望列中包含顺序正确的行为,但这不是在计算日期。您是否希望以正确的顺序将日期返回到另一个文件?@user3483203这两行的顺序是正确的,但第二行包含顺序相同的ACT3和ACT4。当列已经是数字时,为什么还要应用日期函数?我需要查看实际日期。我想您对第二列的顺序是错误的。也是第一次column@Christopher您声明希望列中包含顺序正确的行为,但这不是在计算日期。是否希望以正确的顺序将日期返回到另一个文件?@user3483203两行的顺序正确,但第二行包含顺序相同的ACT3和ACT4。如果我有NaN值怎么办?“('cannotconvert float NaN to integer','accurrent at index ACT1')”为了选择除第一列之外的所有列,我做了
df.loc[:,df.columns!=“ID']].applymap(lambda x:datetime.strtime('1582/10/15',%Y/%m/%d')+timedelta(days=x))
Re:NaN值,在我们转换到datetime(第一行)的地方会发生这种情况吗?”?我以为你的“ID”是一个索引,这就是为什么我没有筛选列的子集。不,ID确实是一个列。NaN值位于每列中。我尝试了:
df.loc[:,df.columns!='ID'].applymap(lambda x:datetime.strtime('1582/10/15',%Y/%m/%d')+timedelta(days=x)if pd.notnull(x)else x)
,它似乎可以工作。但是,它不会显示ID。如果我有NaN值怎么办?“('cannotconvert float NaN to integer','accurrent at index ACT1')”为了选择除第一列之外的所有列,我做了
df.loc[:,df.columns!=“ID']].applymap(lambda x:datetime.strtime('1582/10/15',%Y/%m/%d')+timedelta(days=x))
Re:NaN值,在我们转换到datetime(第一行)的地方会发生这种情况吗?”?我以为你的“ID”是一个索引,这就是为什么我没有筛选列的子集。不,ID确实是一个列。NaN值位于每列中。我尝试了:
df.loc[:,df.columns!='ID'].applymap(lambda x:datetime.strtime('1582/10/15',%Y/%m/%d')+timedelta(days=x)if pd.notnull(x)else x)
,它似乎可以工作。但是,它不会显示ID。您只需迭代每个重新排序列表,然后获取列名称的[0]部分和值的[1]部分,并使用您的格鲁吉亚日历转换器执行转换。谢谢您,非常感谢您的回答!但是,上面的脚本对我的情况更有效。您只需迭代每个重新排序列表,然后获得列名称的[0]部分和值的[1]部分,并使用您的格鲁吉亚日历转换器执行转换。谢谢您,我感谢您的回答!然而,上面的脚本对我的案例更有效。