0

one question. I have a list under a column that looks like this:

`[<36 * Days>, <23 * Days>] `` I would like to get only the values 36 and 23 as integers from this list (so that I can get the mean value from these two numbers for other purposes).

I have tried methods like this:

df['tdColumn'] = pd.to_numeric(df['tdColumn'].dt.days, downcast='integer') df['tdColumn'] = df['tdColumn'].dt.days.astype('int16')

But i keep getting AttributeError: Can only use .dt accessor with datetimelike values

Do you have an idea on how to do this? Thanks.

Mile
  • 11
  • 2

2 Answers2

1

You likely have DateOffset You can use a list comprehension to access the repeat parameter:

df['tdColumn'] = [[x.n for x in l] for l in df['tdColumn']]

Example:

df = pd.DataFrame({'tdColumn': [[pd.DateOffset(x) for x in range(3)]]})
print(df)

                                               tdColumn
0  [<0 * DateOffsets>, <DateOffset>, <2 * DateOffsets>]


df['tdColumn'] = [[x.n for x in l] for l in df['tdColumn']]
print(df)

    tdColumn
0  [0, 1, 2]

If you have a different Offset (e.g. days) you might need a different accessor (e.g. .days):

df = pd.DataFrame({'tdColumn': [[pd.DateOffset(days=x) for x in range(3)]]})
print(df)
                                                             tdColumn
0  [<DateOffset: days=0>, <DateOffset: days=1>, <DateOffset: days=2>]

df['tdColumn'] = [[x.days for x in l] for l in df['tdColumn']]
print(df)
    tdColumn
0  [0, 1, 2]
mozway
  • 194,879
  • 13
  • 39
  • 75
0

You can exctract attribute n in list comprehension, because there is list in columns:

df = pd.DataFrame({'tdColumn':[[pd.offsets.DateOffset(36),
                               pd.offsets.DateOffset(23)]]})

df['tdColumn'] = [[x.n for x in l] for l in df['tdColumn']]
#alternative
df['tdColumn'] = df['tdColumn'].apply(lambda l: [x.n for x in l])
print (df)

   tdColumn
0  [36, 23]

Then for integer column use DataFrame.explode:

df = df.explode('tdColumn')
print (df)
  tdColumn
0       36
0       23

Another idea:

df = df.explode('tdColumn')

df['tdColumn'] = [x.n for x in df['tdColumn']]
print (df)

   tdColumn
0        36
0        23

Original solution:

df = pd.DataFrame({'tdColumn':[pd.offsets.DateOffset(36),
                               pd.offsets.DateOffset(23)]})

df['tdColumn'] = df['tdColumn'].apply(lambda x: x.n)
    
print (df)
   tdColumn
0        36
1        23
jezrael
  • 822,522
  • 95
  • 1,334
  • 1,252
  • Thank you on your prompt response. I get this AttributeError: 'list' object has no attribute 'n' – Mile Mar 01 '23 at 10:35